В большинстве случаев при поиске целых объектов используются миллисекунды или даже секунды.Тем не менее, иногда этот сценарий может занять часы или даже дни для поиска в объектах.
Вот мой код:
const varFind = function (predicate, object) {
const results = [];
const isElement = function (element) {
return element instanceof Element || element instanceof HTMLDocument;
}
const varSearch = function (obj, path, cyclicDetect) {
if(typeof(path) == "undefined") {
path = [
"window"
];
cyclicDetect = [];
}
for (var key of Object.keys(obj)) {
path.push(key);
if(predicate(key, obj, path) === true) {
var editedPath = [...path];
for (var i in path) {
if (i != 0) {
editedPath[i] = "['" + editedPath[i] + "']";
}
}
results.push(editedPath.join(""));
}
var isCyclic = false;
const o = obj[key];
if (o && typeof o === "object" && !isElement(o)) {
cyclicDetect.push(obj);
for(var i in cyclicDetect) {
if(cyclicDetect[i] == o) {
isCyclic = true;
}
}
if (!isCyclic) {
varSearch(o, path, cyclicDetect);
}
cyclicDetect.pop(obj);
}
path.pop();
}
}
varSearch(object || window)
return results;
}
Я пытался удалить cyclicDetect.pop(obj)
, но это не помоглоЯ думаю, потому что эта переменная может быть скопирована с тоннами подобъектов.
Я не мог придумать ничего другого, чтобы попробовать.
Пример использования:
var object = {obj: [{x: 27}, {x: 28}]};
var results = varFind((key, obj, path) = > obj[key] == 27);
console.log(results);
//output: ["window['obj']['0']['x']"]
или чаще
var object = {obj: [{x: 27}, {x: 28}]};
var results = varFind((key, obj, path) = > key == "keyName");
console.log(results);
//output: ["window['obj']['0']['x']", "window['obj']['1']['x']"]
Заранее спасибо!