【发布时间】:2022-04-16 01:15:10
【问题描述】:
我尝试做一些基本的事情。我有一个包含多个对象的数组。我想在每个数组对象中添加新的键值对。
我通过以下代码进行了尝试。
exports.addBuyOption = (arr) => {
var newArr=arr;
return new Promise((resolve, reject) => {
for (let i = 0; i < newArr.length; i++) {
newArr[i].name="new name" //updating the existing key value
newArr[i].canBuy=true //new key value
}
setTimeout(() => {
resolve(newArr);
}, 2000)
})
}
我添加了设置超时,因为我只是想确认在循环操作之后是否返回了 Promise。此外,当代码不与原始数组一起运行时,我会使用 newArr 名称创建一个新变量,但代码也不起作用。
exports.addBuyOption = (arr) => {
return new Promise((resolve, reject) => {
for (let i = 0; i < arr.length; i++) {
arr[i].name="new name" //updating the existing key value
arr[i].canBuy=true //new key value
}
resolve(arr);
})
}
使用此代码,我能够更新现有的键值,但无法添加任何新的键值。我究竟做错了什么?我试图改变将键从点运算符添加到数组索引到 Object.assign 的方法,但它们都不适合我。
【问题讨论】:
-
为什么超时和承诺?这不仅仅是直接的对象操作吗?也请使用
[<>]sn-p 编辑器发布minimal reproducible example -
如果更新现有属性有效,该代码肯定会将新属性添加到对象中,除非那些非常不寻常的对象已应用
preventExtensions(在这种情况下,您可以't 添加新属性)。请使用 minimal reproducible example 来更新您的问题,以展示问题,最好是使用 Stack Snippets([<>]工具栏按钮)的 runnable 问题; here's how to do one. -
旁注:
newArr是该变量的误导性名称。它不是一个新数组,它只是另一个指向同一个数组arr的变量。该变量没有理由,您可能只是使用arr。如果您确实想要制作数组的副本,则必须故意这样做,如果您想要制作数组 in 对象的副本,则必须这样做也是。 -
另外,你的问题与html无关。
-
“我添加了设置超时,因为我只是想确认在循环操作之后是否返回了承诺。” 没有超时,该承诺就没有任何意义。
标签: javascript mongodb mongoose