Синхронизация рекурсивной итерации через вложенный объект JavaScript - PullRequest
0 голосов
/ 07 января 2020

У меня есть объект со следующей структурой.

var obj = {
        "a":{"content": [/*elements*/]},
        "b":{
            "d":{
                "g":{"content":[/*elements*/]},
                "h":{
                    "j":{"content":[/*elements*/]},
                    "k":{"content":[/*elements*/]}
                },
                "i":{
                    "l":{"content":[/*elements*/]}
                }
            },
            "e":{"content":[/*elements*/]},
            "f":{"content":[/*elements*/]}
        },
        "c":{"content":[/*elements*/]},
        /* Object goes on with different levels of nesting*/
    };

Формат вложенного объекта демонстрирует уникальное поведение - каждый вложенный объект имеет либо 1. одно свойство с именем "content" значение которого представляет собой одномерный массив элементов, или 2. Вложенные объекты различных уровней, свойства которых в конечном итоге сужаются до (1) выше.

У меня есть рекурсивная функция для поиска content массивы всего объекта obj выглядят следующим образом:

function search(index) {
    for(var key in index) {
            var current = index[key];
            var cLength = Object.keys(current).length;

            if(cLength > 1 ) {
                search(current);
            } else {
             if (index[key]["content"] == undefined) {
                    search(current);
                } else { 
                    contentsArray = index[key]["content"];
                    // Search Contents Array
                }
            }
    }
}

search(obj);

Фактический объект obj является глубоко вложенным объектом с довольно большим количеством записей данных. Я хочу запустить тесты производительности, чтобы получить среднее время, необходимое для поиска элемента в массиве "contents" любого из вложенных объектов. У меня вопрос: как распознать последний for...in l oop родительского объекта obj при рекурсивном цикле его прохождения? (Для записи конечного sh времени) Есть ли лучший способ рассчитать время выполнения такой функции?

Я пытался указать время, когда for loop заканчивает цикл через "contents" массив (для каждого вложенного объекта) в глобальный массив execTime, затем используя функцию setTimeout вне функции поиска, чтобы получить разницу между значениями max и min в execTime, поскольку я не являюсь Обязательно, когда функция рекурсивного поиска перестает выполняться.

Ответы [ 3 ]

1 голос
/ 07 января 2020

@ Комментарий VLAZ оказался весьма полезным: я решил использовать следующее для запуска тестов производительности (до сих пор не нашел * решения в коде, но это делает работу)

console.time("recursion"); 
search(obj); 
console.timeEnd("recursion");

Вот рабочий демо

0 голосов
/ 07 января 2020

Вы можете использовать User Timing API в браузере

function doStuff() {
  // long running
}

performance.mark('start-token');
doStuff();
performance.mark('end-token');
performance.measure('time', 'start-token', 'end-token');

console.log('time: ', performance.getEntriesByType("measure")[0].duration);
performance.clearMarks();
performance.clearMeasures();
0 голосов
/ 07 января 2020

Ваша функция поиска может возвращать общее время выполнения, которое вы можете добавить обратно до первоначального вызова search.

Когда функция поиска достигнет return, это будет Ваш последний рекурсивный вызов. Например, при последнем вызове значение cLength будет равно нулю, что означает, что дальнейший поиск не требуется, и else выполнит нажатие после return после. Это будет происходить вплоть до первоначального вызова search.

...