#javascript #arrays #object
#javascript #массивы #объект
Вопрос:
У меня есть родительский объект с дочерним массивом вложенных объектов. Каждый объект содержит id
ключ с уникальным значением. Функция фильтра должна искать родительский объект для an id
, если он не равен заданному id
, а затем рекурсивно выполнять поиск по вложенным объектам для id
, пока он не будет найден. Как только объект с заданным ключом найден, удалите и верните обновленный myObject
.
Структура выглядит следующим образом:
let myObject = {
key: 1,
name: 'hello',
children: [
{
key: 2,
name: 'world',
children: []
},
{
key: 3,
name: 'hope',
children: [
{
key: 4,
name: 'you',
children: [{
key: 5,
name: 'are',
children: []
}]
},
{
key: 6,
name: 'having',
children: [{
key: 7,
name: 'fun',
children: []
}]
}
]
}
]
}
let given = 4;
if (myObject.key !== given) {
myObject = searchChild(myObject, given)
} else {
myObject = {}
}
function searchChild(parent, given) {
parent.children.map(child => {
return child.children.filter(item => {
if (item.key === given) return item;
else if (item.key !== given
amp;amp; child.children.length > 0
amp;amp; child.children != undefined) {
searchChild(child.children, given);
}
})
})
}
В настоящее время я получаю сообщение об ошибке типа при запуске рекурсивной функции.
Вывод должен выглядеть так, где ключи обновляются до нового порядка в дереве:
{
key: 1,
name: 'hello',
children: [
{
key: 2,
name: 'world',
children: []
},
{
key: 3,
name: 'hope',
children: [
{
key: 4,
name: 'having',
children: [{
key: 5,
name: 'fun',
children: []
}]
}
]
}
]
}
Комментарии:
1.
searchChild
никогда не возвращает определенное значение и не изменяет его аргументы. Он должен сделать одну из этих вещей. Какого из них вы ожидали?
Ответ №1:
Вот функция, которую вы можете вызвать для своего объекта
function searchInChild(parent,key){
parent.children = parent.children.filter((c)=>{
if(key == c.key ){
result = c;
return false;
}
return true;
});
if(result == null){
for(c in parent.children){
searchInChild(parent.children[c],key);
}
}
}
Где вы можете просто передать searchInChild(MyObject,key) и сделать результат глобальной переменной.
Ответ №2:
Вы проходите child.children
, но вам нужно передать child
, что вы уже выполнили итерацию children
в функции.
let myObject = {
key: 1,
name: 'hello',
children: [
{
key: 2,
name: 'world',
children: []
},
{
key: 3,
name: 'hope',
children: [
{
key: 4,
name: 'you',
children: [{
key: 5,
name: 'are',
children: []
}]
},
{
key: 6,
name: 'having',
children: [{
key: 7,
name: 'fun',
children: []
}]
}
]
}
]
}
let given = 4;
if (myObject.key !== given) {
myObject = searchChild(myObject, given)
} else {
myObject = {}
}
function searchChild(parent, given) {
if(parent amp;amp; parent.children) {
parent.children.map(child => {
return child.children.filter(item => {
if (item.key === given) return item;
else if (item.key !== given
amp;amp; child.children.length > 0
amp;amp; child.children != undefined) {
searchChild(child, given);
}
})
})
}
}
Комментарии:
1. Ах, да! Это отличное начало, но лишь частичный ответ на вопрос.