#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть вложенный массив объектов, мне нужно динамически изменять значения дочерних данных
[
{
type: "root",
title: "FileManager",
isDirectory: true,
children: [
{
type: "folder",
title: "animals",
isDirectory: true,
children: [
{
type: "folder",
title: "cat",
isDirectory: true,
children: [
{
type: "folder",
title: "images",
isDirectory: true,
children: [
{
type: "file",
title: "cat001.jpg",
isDirectory: false,
}, {
type: "file",
title: "cat002.jpg",
isDirectory: false,
}
]
}
]
}
]
},
{
type : "folder",
title : 'Birds',
isDirectory : true,
children : []
}
]
}
]
это мой основной массив объектов предположим, если я хочу динамически изменять значение дочерних элементов.
давайте возьмем, что я хочу добавить еще один объект к дочерним элементам внутри массива изображений
, чтобы путь к массиву изображений был
FileManager / animals / cat / images
как можно динамически изменять значение дочерних элементов в объекте images?
Комментарии:
1. Для этого и существует state. Тем не менее, вам лучше использовать JSX. Это намного чище
2. итак, вы просто хотите изменить массив изображений, как в заголовке
children array
where — изображения, верно?3. «динамически изменять значение дочерних элементов в объекте images» — это зависит от того, что, по вашему мнению, является «динамически»? Вы хотите изменить значения в событии dom, например
onclick
etc, или с помощью другого метода?4. @rags2riches да, я хочу изменить дочерний массив в объекте images «динамически»
5. @PraneetDixit на самом деле это мини-проводник файлов в моем приложении react всякий раз, когда я создаю новую папку или удаляю папку, мне нужно выполнить цикл и зайти внутрь объекта и изменить его дочерние элементы, добавив или удалив объект
Ответ №1:
Основываясь на предоставленной структуре данных, вы можете использовать рекурсивное решение для доступа к интересующему вас вложенному массиву, а затем, когда рекурсия достигает base case
, вы можете либо вставить новый объект / объекты в массив на этом определенном уровне глубины, либо использовать функцию обратного вызова, чтобы вставить как можно больше новых объектов в это.
Я не совсем уверен в «динамической» части, на которую вы ссылаетесь, но следующее должно направить вас в правильном направлении:
function rec(array) {
for (let i in array) {
if (array[i].children === undefined) { // BASE CASE
// console.log("base case ", array);
// push the object you want into the array, as at this point in the
// recursion you will be at the level you can modify your image array as you like
return array.push({ "myImage": "myBeautifulCatImage", "does": "poooooor"});
}
// recursive call
// visualise how deep you are going...
// console.log("rec", array[i].children);
return rec(array[i].children);
}
}
rec(arr);
// if you know log your arr as in:
// console.log("arr after recursion", rec(arr))
// you will see your new cat showing where it should be :)
Если этот ответ поможет вам решить проблему, подумайте о том, чтобы принять ответ или проголосовать за него. Спасибо.