У меня есть множество объектов (возможных тысяч), которые могут быть или не быть вложенными (возможные десятки гнезд). Подмножество данных выглядит следующим образом: < /p>
let data = [
{"id":"m1", "name":"M1"},
{"id":"m2", "name":"M2"},
{"parent_id":"m2", "id":"s1", "name":"S1"},
{"parent_id":"m2", "id":"s2", "name":"S2"},
{"parent_id":"m2", "id":"s3", "name":"S3"},
{"parent_id":"s3", "id":"b1", "name":"B1"}
];
< /code>
Этот список выглядит довольно заказано, но в реальной жизни объекты могут появиться в любом месте в массиве, т.е. не заказано. Также обратите внимание, что объекты на верхнем слое не имеют parent_id. Я бы хотел, чтобы массив был преобразован в: < /p>
newData = [
{ id: 'm1', name: 'M1'},
{ id: 'm2', name: 'M2', children:
[ { parent_id: 'm2', id: 's1', name: 'S1'},
{ parent_id: 'm2', id: 's2', name: 'S2'},
{ parent_id: 'm2', id: 's3', name: 'S3', children:
{ parent_id: 's3', id: 'b11', name: 'B1'}
} ]
}
]
< /code>
Я искал различные идеи и решил, что этот ответ приблизился, так что вот где я начал: < /p>
const createDataTree = dataset => {
let hashTable = Object.create(null)
dataset.forEach( aData => hashTable[aData.id] = { ...aData, children : [] } )
let dataTree = []
dataset.forEach( aData => {
if( aData.parent_id ) hashTable[aData.parent_id].children.push(hashTable[aData.id])
else dataTree.push(hashTable[aData.id])
} )
return dataTree
};
console.log(createDataTree(data));
< /code>
Были очевидны две начальные проблемы- я не хочу, чтобы объекты без детей имели пустое свойство- Дети: [], и этот код работает только с одним дочерним уровнем, а не с множеством. /p>
Для первого выпуска я попробовал: < /p>
const createDataTree = dataset => {
let hashTable = Object.create(null)
let dataTree = []
dataset.forEach( aData => {
if( !aData.parent_id ) hashTable[aData.id] = { ...aData, children : [] }
if( aData.parent_id ) hashTable[aData.parent_id].children.push(hashTable[aData.id])
else dataTree.push(hashTable[aData.id])
} )
return dataTree
};
console.log(createDataTree(data))
< /code>
Это не сработало (во всех объектах все еще были дети: []), а также я не понимаю, как хвосные ссылки, такие как DataTree, автоматически обновляется, когда Хэштебильный толчок происходит.
Мне нравится этот подход из-за его производительности с большими массивами- какие изменения необходимы для детей: [] и множественные уровни, или есть более быстрое решение?
Подробнее здесь: https://stackoverflow.com/questions/794 ... sub-levels
Создание иерархического массива объектов со многими подразделениями ⇐ Javascript
Форум по Javascript
-
Anonymous
1739225540
Anonymous
У меня есть множество объектов (возможных тысяч), которые могут быть или не быть вложенными (возможные десятки гнезд). Подмножество данных выглядит следующим образом: < /p>
let data = [
{"id":"m1", "name":"M1"},
{"id":"m2", "name":"M2"},
{"parent_id":"m2", "id":"s1", "name":"S1"},
{"parent_id":"m2", "id":"s2", "name":"S2"},
{"parent_id":"m2", "id":"s3", "name":"S3"},
{"parent_id":"s3", "id":"b1", "name":"B1"}
];
< /code>
Этот список выглядит довольно заказано, но в реальной жизни объекты могут появиться в любом месте в массиве, т.е. не заказано. Также обратите внимание, что объекты на верхнем слое не имеют parent_id. Я бы хотел, чтобы массив был преобразован в: < /p>
newData = [
{ id: 'm1', name: 'M1'},
{ id: 'm2', name: 'M2', children:
[ { parent_id: 'm2', id: 's1', name: 'S1'},
{ parent_id: 'm2', id: 's2', name: 'S2'},
{ parent_id: 'm2', id: 's3', name: 'S3', children:
{ parent_id: 's3', id: 'b11', name: 'B1'}
} ]
}
]
< /code>
Я искал различные идеи и решил, что этот ответ приблизился, так что вот где я начал: < /p>
const createDataTree = dataset => {
let hashTable = Object.create(null)
dataset.forEach( aData => hashTable[aData.id] = { ...aData, children : [] } )
let dataTree = []
dataset.forEach( aData => {
if( aData.parent_id ) hashTable[aData.parent_id].children.push(hashTable[aData.id])
else dataTree.push(hashTable[aData.id])
} )
return dataTree
};
console.log(createDataTree(data));
< /code>
Были очевидны две начальные проблемы- я не хочу, чтобы объекты без детей имели пустое свойство- Дети: [], и этот код работает только с одним дочерним уровнем, а не с множеством. /p>
Для первого выпуска я попробовал: < /p>
const createDataTree = dataset => {
let hashTable = Object.create(null)
let dataTree = []
dataset.forEach( aData => {
if( !aData.parent_id ) hashTable[aData.id] = { ...aData, children : [] }
if( aData.parent_id ) hashTable[aData.parent_id].children.push(hashTable[aData.id])
else dataTree.push(hashTable[aData.id])
} )
return dataTree
};
console.log(createDataTree(data))
< /code>
Это не сработало (во всех объектах все еще были дети: []), а также я не понимаю, как хвосные ссылки, такие как DataTree, автоматически обновляется, когда Хэштебильный толчок происходит.
Мне нравится этот подход из-за его производительности с большими массивами- какие изменения необходимы для детей: [] и множественные уровни, или есть более быстрое решение?
Подробнее здесь: [url]https://stackoverflow.com/questions/79428435/creating-a-hierarchical-array-of-objects-with-many-sub-levels[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия