У меня есть вложенные объекты в моем состоянии:
constructor(props) {
super(props);
this.state = {
aba1Array: [
{
item:[
{
id: 1,
nome: "apple",
selected:false,
},
{
id: 2,
nome: "juice",
selected:false,
}
]
},
{
item:[
{
id: 3,
nome: "apple",
selected:false,
},
{
id: 4,
nome: "juice",
selected:false,
}
]
}
],
};
}
Теперь я хочу сделать копию массива, обновить элемент и снова установить setState (это правильный способ обновления, верно?)как это сделать?это мой текущий код:
updateItem(id){
let newItems = Object.keys(this.state.aba1Array).map((subitem) => {
subitem.item.map((item) => item.id===id ? {...item, selected: true } : item);
});
this.setState({ aba1Array: newItems });
}
это возвращает: TypeError: undefined не является объектом (оценка 'subitem.item.map')
отредактировано: проблема началась, когда я добавилвторой уровень вложенности, прежде чем он работал нормально, с одним уровнем, например:
let newItems = Object.keys(this.state.aba1Array).map((item) => {
item.id===id ? {...item, selected: true } : item);
edited2: в другой части экрана, где я только перечисляю элементы, я использую:
listItem() {
return this.state.aba1Array.map((subitem)=> {
return ( subitem.item.map((item) => { return ( <View>
...
и работает нормально.Почему в функции обновления это дает мне ошибку?Я не понимаю
Отредактировано 3: - РЕШЕНИЕ -
Мое решение состояло в том, чтобы использовать библиотеку object-path-immutable:
updateItem(itemIndex,subIndex){
const newObj = immutable.update(this.state.aba1Array, [subIndex,'item', itemIndex , 'selected' ], v => true );
this.setState({ aba1Array: newObj });
}