Как повысить эффективность этого рекурсивного объекта или поисковика массива? - PullRequest
0 голосов
/ 20 сентября 2019

В большинстве случаев при поиске целых объектов используются миллисекунды или даже секунды.Тем не менее, иногда этот сценарий может занять часы или даже дни для поиска в объектах.

Вот мой код:

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']"]

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...