[英]Update array object object value using spread operator
我试图从数组对象和对象更新值。 我的示例代码如下。 没有像我预期的那样得到结果。 如果有人可以提供帮助,那会很好吗?
let array = [
{
id:"01",
"name": {
"value": "jaison",
"error": null
},
"email": {
"value": "jaison@yopmail.com",
"error": null
}
},
{
id:"02",
"name": {
"value": "jaison 1",
"error": null
},
"email": {
"value": "jaison1@yopmail.com",
"error": null
}
}
];
this.state{
data:array
}
//This two data getting a from a form
const key = "02";
const editedData = {name:"updated jaison 1", email:"updatedjaison1@yopmail.com"}
const newData = [...this.state.data];
const index = newData.findIndex(item => key === item.id);
let item = newData[index];
//Working as expcted
console.log('1', item);
Object.keys(editedData).forEach(function (key) {
item[key] = editedData[key];
});
//Working as expcted
console.log('2', item);
this.setState({ data: [...this.state.data, item]}, () => {
//Not Working as expcted
console.log(this.state.data);
});
Expected result
let array = [
{
id:"01",
"name": {
"value": "jaison",
"error": null
},
"email": {
"value": "jaison@yopmail.com",
"error": null
}
},
{
id:"02",
"name": {
"value": "updated jaison 1",
"error": null
},
"email": {
"value": "updatedjaison1@yopmail.com",
"error": null
}
}
];
当你更新forEach
item[key]
,它只是用字符串值更新name
和email
。 而且,它改变了state
相反,您可以循环throguh editedData
对象更新该特定索引的克隆。 使用spread语法保持error
和其他属性不变,只更新value
属性。 然后更新克隆data
数组的索引并调用setState
如下所示:
const key = "02",
editedData = { name: "updated jaison 2", email: "updatedjaison2@yopmail.com" },
data = [...this.state.data],
index = data.findIndex(item => key === item.id),
updatedData = { ...data[index] };
// loop through and update only the keys you need
for(const key in editedData) {
updatedData[key] = { ...updatedData[key], value: editedData[key] }
}
data[index] = updatedData;
this.setState({ data })
我没有找到索引并使用forEach
循环遍历数组,而是执行以下操作:
const updatedArray = newData.map(item => {
// if editedData has a key attribute:
if (item.id === editedData.key) {
return editedData; //you'd need to add a key attribute to the data
} else {
return item;
}
});
this.setState({data: updatedArray});
你可以使用map
:
let array = [
{
id:"01",
"name": {
"value": "jaison",
"error": null
},
"email": {
"value": "jaison@yopmail.com",
"error": null
}
},
{
id:"02",
"name": {
"value": "jaison 1",
"error": null
},
"email": {
"value": "jaison1@yopmail.com",
"error": null
}
}
];
const key = "02";
const updated = array.map(item => {
if (item.id === key) {
return {id: key, name:"updated jaison 1", email:"updatedjaison1@yopmail.com"}
}
return item;
});
setState({data: updated});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.