Javascriptオブジェクト内で検索すると、新鮮な話題のようです.
9269 ワード
どうして
なぜか、見つからなかったからだ.
用途
例えば、映画サイトでリンクを見つけたり、小説サイトでリンクを見つけたりする用途もありません.二品同僚が書いた複雑な相手.ちょっと待ってください.どうせ検索すればいいのに.
ターゲット
オブジェクト内のレイヤに関係なく、キーワードが見つかります.
キーワードの可能な場所
1.属性名、2.属性値、3.メソッド名、4.メソッド内.
簡単な方法
オブジェクトをjsonに変換して文字列を検索するのは,処理方法を必要としない前提で非常に便利で,正規表現で処理することもできるが,検索した結果は位置決めだけで経路を復元するのは難しい.
もう一つの簡単な方法
オブジェクトを遍歴して、とても直接で、1つの再帰的に最後まで探して、1つの穴だけで、ネストされたオブジェクトを循環してどのように処理します.
くぼみを這う
見たオブジェクトごとにマークを付け、マークを見ると内部を見なくなります.タグのオブジェクトにターゲット文字列が含まれている場合は、オブジェクトパスを1つ保存し、値だけに関心を持っていれば保存しなくてもいいです.
話をしているうちに,問題が分析してわかった.非常に唯一のタグを作ることが重要で、このタグを削除して、繰り返し検索することを覚えています.
ヒットマークは処理されていませんが、他はokです.
なぜか、見つからなかったからだ.
用途
例えば、映画サイトでリンクを見つけたり、小説サイトでリンクを見つけたりする用途もありません.二品同僚が書いた複雑な相手.ちょっと待ってください.どうせ検索すればいいのに.
ターゲット
オブジェクト内のレイヤに関係なく、キーワードが見つかります.
キーワードの可能な場所
1.属性名、2.属性値、3.メソッド名、4.メソッド内.
簡単な方法
オブジェクトをjsonに変換して文字列を検索するのは,処理方法を必要としない前提で非常に便利で,正規表現で処理することもできるが,検索した結果は位置決めだけで経路を復元するのは難しい.
もう一つの簡単な方法
オブジェクトを遍歴して、とても直接で、1つの再帰的に最後まで探して、1つの穴だけで、ネストされたオブジェクトを循環してどのように処理します.
くぼみを這う
見たオブジェクトごとにマークを付け、マークを見ると内部を見なくなります.タグのオブジェクトにターゲット文字列が含まれている場合は、オブジェクトパスを1つ保存し、値だけに関心を持っていれば保存しなくてもいいです.
話をしているうちに,問題が分析してわかった.非常に唯一のタグを作ることが重要で、このタグを削除して、繰り返し検索することを覚えています.
var findInObject = {
fio_MARKED: 1,
CustomObjects: [],
marked: [],
searchResult: [],
defaultname: ['frames', 'self', 'window', 'parent', 'top', 'location', 'content', 'document', 'history', 'locationbar', 'menubar', 'personalbar', 'scrollbars', 'statusbar', 'toolbar', 'navigator', 'applicationCache', 'customElements', 'screen', 'clientInformation', 'styleMedia', 'performance', 'caches', 'crypto', 'indexedDB', 'webkitStorageInfo', 'sessionStorage', 'localStorage', 'visualViewport', 'speechSynthesis', 'chrome', 'external', 'qb_external', 'qb_minivideo', 'qbmv', 'userObjects', 'defaultStatus', 'll', 'lll', 'gnp', 'vm'],
fio(obj, str, path, flag) {
if (!path) path = 'window'
if (!flag) flag = 'fioflg_' + Date.parse(new Date())
const otype = typeof obj
if (otype == 'string') {
if (obj.indexOf(str) > -1) {
this.searchResult.push({ path: path, type: " ", value: obj })
}
} else if (typeof obj == 'function') {
var strfunc = obj.toString()
if (strfunc.indexOf(str) > -1) {
this.searchResult.push({ path: path, type: ' ', value: strfunc })
}
} else if (typeof obj == 'number') {} else if (typeof obj == 'bigint') {} else if (typeof obj == 'boolean') {} else if (typeof obj == 'symbol') {} else if (Array.isArray(obj)) {
if (this.isMarked(obj, flag) == false) {
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
const element = obj[key];
this.fio(element, str, path + '[' + key + ']', flag)
}
}
}
} else if (obj instanceof Object) {
if (this.isMarked(obj, flag) == false) {
if (obj[str] != undefined) {
this.searchResult.push({ path: path + '/' + str, type: ' ', value: obj[str] })
}
for (const key in obj) {
if (this.defaultname.indexOf(key) == -1) {
if (obj.hasOwnProperty(key)) {
try {
var element = obj[key]
} catch (error) {
var element = {}
}
if (path == 'window') {
var ty = typeof element
if (['function', 'number', 'bigint', 'boolean', 'symbol', 'string'].indexOf(ty) == -1 && Array.isArray(element) == false && element instanceof Object) {
this['CustomObjects'][key] = element
}
}
this.fio(element, str, path + '.' + key, flag)
}
}
}
}
}
},
isMarked(obj, flag) {
if (obj.fio_MARKED) {
return true
} else {
obj.fio_MARKED = flag
this.marked.push(obj)
return false
}
},
search(str) {
this.fio(window, str)
this.marked.forEach(item => {
delete item['fio_MARKED']
});
this.marked = []
console.log(this)
},
}
ヒットマークは処理されていませんが、他はokです.