Оптимизировать JavaScript

Может ли кто-нибудь помочь мне найти лучший способ оптимизировать приведенный ниже код, так как это занимает много времени, когда у меня есть тысячи записей, ищущих

var arr =[
   {
      children:[
         {
            children:[
               {
                  children:[
                     {
                        name:'XYZZZZZ'
                     }
                  ]
               }
            ]
         }
      ]
   }
];

        let list = [];

        //Calculate column list
        arr.forEach((obj0) => {
            if (obj0.hasOwnProperty('children')) {
                if (obj0.children.length > 0) {
                    let objchid1 = obj0.children;
                    objchid1.forEach((obj1) => {
                        if (obj1.hasOwnProperty('children')) {
                            if (obj1.children.length > 0) {
                                let objchid2 = obj1.children;
                                objchid2.forEach((obj2) => {
                                    if (obj2.hasOwnProperty('children')) {
                                        if (obj2.children.length > 0) {
                                            let objchid3 = obj2.children;
                                         objchid3.forEach((obj3) => {
                                            if (obj3.name !== 'james') {
                                    console.info('IN THREEE', obj3.name);
                                                list.push(obj3.name);
                                                }
                                            });

                                        }
                                    }
                                });
                            }
                        }
                    });
                }
            }
        });

Я много пробовал искать, но безуспешно. Заранее спасибо. !!!

Я бы рекомендовал изучить создание рекурсивной функции

Patrick Evans 28.04.2018 16:06

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

charlietfl 28.04.2018 16:20

Если вы запускаете это несколько раз (например, инструмент поиска), следует рассмотреть возможность сохранения результатов.

charlietfl 28.04.2018 16:23

@charlietfl Даже если это только улучшит внешний вид, это все равно своего рода оптимизация. Но в рекурсии хорошо то, что вы проверяете только наличие children и неважно, глубина ли она 24 ... рекурсия будет проверять глубину 24 в одной строке по сравнению с 24 столбцами с вкладками циклов forEach.

Matt 28.04.2018 18:20

Может ли объект иметь свойство имени на любом уровне?

HMR 28.04.2018 19:24

Отбросьте ненужные условия if (obj.children.length > 0) {

Bergi 28.04.2018 19:31

Вы всегда ищете только james? Тогда нет, на самом деле нет способа оптимизировать это, не начав с другой структуры данных в первую очередь.

Bergi 28.04.2018 19:32

@Matt просто пытается дать ОП разумные ожидания. OP упомянул, что время запуска (производительность) было проблемой

charlietfl 28.04.2018 19:34

создайте новый массив Object для поиска, поэтому вам нужно только пройти через уникальный массив, и ваш поиск будет выполняться быстрее. например, у вас может быть что-то вроде [{name: 'aaa', index0: 0, index1: 0, index2: 0}, {name: 'aab', index0: ‌ 0, index1: 0, index2: 1} ‌ .. {имя: 'первый', индекс0‌: 10, индекс1: 2, индекс2: ‌ 0} ..]

Eliseo 28.04.2018 19:45

Я не думаю, что производительность может быть заметно улучшена с помощью этой структуры данных. Вы должны оптимизировать данные, чтобы уменьшить сложность: 1. Если данные отсортированы, вы можете использовать двоичный поиск, что намного быстрее. 2. Если вы используете хэш-карты, доступ к значениям имеет постоянное время. Вы также можете использовать дерево И хэш-карту для быстрого доступа. Затем вам необходимо одновременно обновить структуры данных.

Aloso 28.04.2018 19:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
10
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
  1. Оптимизируйте структуру данных. Не используйте вложенные массивы, если в этом нет необходимости. NoSQL настолько популярен, когда дело доходит до WebDev, потому что операций чтения происходит в 100000 раз больше, чем операций записи, а экономия полосы пропускания (для вас и пользователя) стоит больше, чем экономия на дублировании данных в базе данных, учитывая, насколько дешевое оборудование
  2. Вы можете сохранить элементы самого глубокого массива как ключи объекта (с вложенным атрибутом .name в вашем случае) и индекс соответствующей позиции в массиве как значение объекта. Таким образом, вы можете выполнить myArray[myElementsToIndexObject['elementIamLookingFor']], выполняя итерацию только один раз по вложенному массиву (для построения myElementsToIndexObject).

Если данные взяты из строки JSON, поиск может быть выполнен во время синтаксического анализа:

var list = [], json = '[{"child":[{"child":[{"child":[{"name":"XYZZZZZ"}]}]}]}]'

var arr = JSON.parse(json, (key, val) => (key === 'name' && list.push(val), val))

console.info(list)
console.info(arr)

Другие вопросы по теме