javascript - 具有不可变状态的循环内的对象更新
问题描述
我正在研究 React 应用程序,我需要在循环内更新我的 objcet,我的对象结构是,
[{
"iD": "101",
"bD": "06/02/2018",
"cD": "16/04/2018"
},
{
"iD": "102",
"bD": "06/02/2018",
"cD": "16/04/2018"
},
{
"iD": "103",
"bD": "06/02/2018",
"cD": "16/04/2018"
}]
我的想法是我必须为每个对象添加几个键,我采用的方法似乎不合适,因为我正在更新对象但没有将更新的值推送到数组中并返回新值。有没有其他方法可以用突变更新它?
我正在尝试 for in 循环:
let newList = {};
for (let key in list) {
newList = Object.assign({}, list[key]);
newList.newKey1 = 'demo1';
newList.newKey2 = 'demo2';
};
现在,如果我返回 newList,它将始终具有最后更新的值。那么我将如何获得完整的更新列表。数组可能只有一项,例如:
[{
"id":"101",
"bD":"06/02/2018",
"cD":"16/04/2018"
}]
解决方案
要通过直接突变将数组中的每个项目转换为其他项目,您可以使用 for (for..of
或forEach
) 循环的一个版本:
const items = [{
iD: "101",
bD: "06/02/2018",
cD: "16/04/2018"
},
{
iD: "102",
bD: "06/02/2018",
cD: "16/04/2018"
},
{
iD: "103",
bD: "06/02/2018",
cD: "16/04/2018"
}
];
for (const item of items) {
item.newKey1 = 'demo1';
item.newKey2 = 'demo2';
}
console.log(
items
);
要通过返回一个更改了项目的新数组来将数组中的每个项目转换为某种东西,您应该使用Array.prototype.map
:
const items = [
{
iD: "101",
bD: "06/02/2018",
cD: "16/04/2018"
},
{
iD: "102",
bD: "06/02/2018",
cD: "16/04/2018"
},
{
iD: "103",
bD: "06/02/2018",
cD: "16/04/2018"
}
];
console.log(
items.map(item =>
Object.assign({}, item, {
newKey1: "demo1",
newKey2: "demo2"
})
)
);
或者如果您的环境支持,则使用对象传播:
const items = [
{
iD: "101",
bD: "06/02/2018",
cD: "16/04/2018"
},
{
iD: "102",
bD: "06/02/2018",
cD: "16/04/2018"
},
{
iD: "103",
bD: "06/02/2018",
cD: "16/04/2018"
}
];
console.log(
items.map(item => ({
...item,
newKey1: "demo1",
newKey2: "demo2"
}))
);
推荐阅读
- f# - 从公共字符串生成 href 值和路由模式
- mysql - 从历史表中查询项目
- jenkins - 如何使用 jenkins 向 microsoft team\skype 发送管道更改(提交)通知
- python - 尝试在 Google Colab 上安装 xlwings
- django - django:我不小心删除了 manage.py 文件。如何恢复它?
- amazon-web-services - 如何在 aws EC2 中设置 Sockect.io 服务器,然后远程连接到服务器?
- php - 使用 Laravel 自动生成发票
- php - PHP:如何使用 GET 发送 cURL 请求?
- python - Keras model.inputs 不保存名称
- angular - 在 Angular 中使用 Alpine JS 和 Tailwind UI