Может ли кто-нибудь помочь мне найти лучший способ оптимизировать приведенный ниже код, так как это занимает много времени, когда у меня есть тысячи записей, ищущих
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);
}
});
}
}
});
}
}
});
}
}
});
Я много пробовал искать, но безуспешно. Заранее спасибо. !!!
Рекурсивная функция будет выглядеть намного чище, но все этапы обработки останутся такими же, и я сомневаюсь, что сильно изменит производительность.
Если вы запускаете это несколько раз (например, инструмент поиска), следует рассмотреть возможность сохранения результатов.
@charlietfl Даже если это только улучшит внешний вид, это все равно своего рода оптимизация. Но в рекурсии хорошо то, что вы проверяете только наличие children и неважно, глубина ли она 24 ... рекурсия будет проверять глубину 24 в одной строке по сравнению с 24 столбцами с вкладками циклов forEach.
Может ли объект иметь свойство имени на любом уровне?
Отбросьте ненужные условия if (obj.children.length > 0) {
Вы всегда ищете только james? Тогда нет, на самом деле нет способа оптимизировать это, не начав с другой структуры данных в первую очередь.
@Matt просто пытается дать ОП разумные ожидания. OP упомянул, что время запуска (производительность) было проблемой
создайте новый массив Object для поиска, поэтому вам нужно только пройти через уникальный массив, и ваш поиск будет выполняться быстрее. например, у вас может быть что-то вроде [{name: 'aaa', index0: 0, index1: 0, index2: 0}, {name: 'aab', index0: 0, index1: 0, index2: 1} .. {имя: 'первый', индекс0: 10, индекс1: 2, индекс2: 0} ..]
Я не думаю, что производительность может быть заметно улучшена с помощью этой структуры данных. Вы должны оптимизировать данные, чтобы уменьшить сложность: 1. Если данные отсортированы, вы можете использовать двоичный поиск, что намного быстрее. 2. Если вы используете хэш-карты, доступ к значениям имеет постоянное время. Вы также можете использовать дерево И хэш-карту для быстрого доступа. Затем вам необходимо одновременно обновить структуры данных.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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)
Я бы рекомендовал изучить создание рекурсивной функции