Я искал что-то, что помогло бы мне решить эту конкретную проблему, но я не нашел подходящего решения, которое подходит для моего случая. Я был бы очень признателен, если бы кто-нибудь мог указать мне в правильном направлении.
У меня есть массив:
var ruizTreeData = [
{
"Name": "Ruiz Hernandez",
"parent": "null",
"nodetype": "person",
"Country": "assets/img/aml-flag-1.png",
"children": [
{
"Name": "Checking",
"nodetype": "account",
"Country": "assets/img/aml-flag-1.png",
"children": [
{
"Name": "Renato Godoy",
"nodetype": "person",
"Country": "assets/img/aml-flag-4.png"
},
{
"Name": "Juan Nieto",
"nodetype": "person",
"Country": "assets/img/aml-flag-4.png"
},
{
"Name": "Bani Cortes",
"nodetype": "person",
"Country": "assets/img/aml-flag-2.png"
},
{
"Name": "Medina Marquez",
"nodetype": "person",
"Country": "assets/img/aml-flag-2.png"
}
]
}
]
}
];
У меня есть другая функция, которая создает объект, и я хотел бы вставить этот объект в это «дерево» по определенному индексу. Так, например, пользователь решит вставить нового человека под «Руис Эрнандес», поэтому я создам объект, который будет родственным «Проверке». Но я хочу, чтобы он был достаточно гибким, чтобы, если бы кто-то добавил в качестве дочернего элемента «Проверка», мы сделали бы то же самое, или дочерний элемент «Бани Кортес», мы сделали бы то же самое и т. д.
Я думаю, мне придется повторять ruizTreeData, пока я не найду «Руис Эрнандес», а затем вставить объект в массив children «Руиса Эрнандеса».
Таким образом, массив будет выглядеть так:
var ruizTreeData = [
{
"Name": "Ruiz Hernandez",
"parent": "null",
"nodetype": "person",
"Country": "assets/img/aml-flag-1.png",
"children": [
{
"Name": "Checking",
"nodetype": "account",
"Country": "assets/img/aml-flag-1.png",
"children": [
{
"Name": "Renato Godoy",
"nodetype": "person",
"Country": "assets/img/aml-flag-4.png"
}...
]
},
{
"Name": "Inserted object",
"nodetype": "account",
"Country": "assets/img/aml-flag-1.png"
}
]
}
];
Я пробовал кучу вещей, самое близкое, что у меня есть:
positionInTree = ruizTreeData
.map(function (element) {return element["Name"];})
.indexOf("Ruiz Hernandez");
Но это возвращается только по первому индексу, оно не входит во вложенные объекты. Нужна ли мне для этого петля for?
Я был бы очень признателен за помощь в этом. Большое спасибо.



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


Ну вот. Вы можете выбрать свой элемент по идентификатору ключа/значения, и эта функция создаст дочернее свойство, если его еще нет с вашим объектом внутри него, или добавит ваш объект в уже существующее дочернее свойство.
Я добавил человека по имени Руис Эрнандес в последний узел (дочерние элементы Checking), чтобы показать вам, как функция добавляет ваш объект в каждый узел с вашим идентификатором ключа/значения.
var ruizTreeData = [
{
"Name": "Ruiz Hernandez",
"parent": "null",
"nodetype": "person",
"Country": "assets/img/aml-flag-1.png",
"children": [
{
"Name": "Checking",
"nodetype": "account",
"Country": "assets/img/aml-flag-1.png",
"children": [
{
"Name": "Renato Godoy",
"nodetype": "person",
"Country": "assets/img/aml-flag-4.png"
},
{
"Name": "Juan Nieto",
"nodetype": "person",
"Country": "assets/img/aml-flag-4.png"
},
{
"Name": "Bani Cortes",
"nodetype": "person",
"Country": "assets/img/aml-flag-2.png"
},
{
"Name": "Ruiz Hernandez",
"nodetype": "person",
"Country": "assets/img/aml-flag-2.png"
},
{
"Name": "Medina Marquez",
"nodetype": "person",
"Country": "assets/img/aml-flag-2.png"
}
]
}
]
}
];
Array.prototype.addChild = function(key, value, object){
let el;
if (this.find(x => x[key] == value)){
this.filter(x => x[key] == value).forEach(y => y.children = (y.children) ? [...y.children, {...object}] : [{...object}])
}
this.forEach(y => {
if (y.children){
y.children.addChild(key, value, object);
}
});
}
ruizTreeData.addChild("Name", "Ruiz Hernandez", {Name: "Name"});
console.info(ruizTreeData);
Это прекрасно. Большое спасибо, вы очень помогли.