首页 > 解决方案 > 无法将新键值添加到具有 JSON 对象的现有 JSON 数组中

问题描述

这是我尝试过的。我试过点符号和引号。它们似乎都不起作用。究竟可能是什么问题?

var clientsList;

Client.find({}, function(err, clients) {
    clientsList = clients; 
   // I have 10 clients in the loop 
   for (var j = 0; j < clientsList.length; j++) {
            var x =  clientsList[j];
            x.count = "20";
            //x["count"] = "20";
            console.log(x);
        }

});

现有的客户对象

{"name":"abcd", "email":"abc@gmail.com"}

我无法将计数键值对添加到客户端对象中。可能是什么问题呢?

标签: jsonnode.js

解决方案


我怀疑您所获得的对象Client.find已阻止扩展(它已密封冻结)。

您可以使用 ES2018 扩展符号创建一个具有原始对象自己的可枚举属性以及您的属性的新对象:count

x = {...x, count: "20"};

...或 ES2015 的Object.assign

x = Object.assign({}, x, {count: "20"});

如果数组也被密封或冻结,您可以像这样复制它及其对象:

clientList = clients.map(client => {
    return {...client, count: "20"}; // Or with `Object.assign`
});

甚至使用箭头函数的简洁形式:

clientList = clients.map(client => ({...client, count: "20"}));

旁注:这种模式:

var clientsList;
Client.find({}, function(err, clients) {
    clientsList = clients; 
    // ...
});

...通常建议您打算在调用clientsList之后的代码中使用Client.find并期望它具有该调用回调的结果。请参阅此问题的答案,了解为什么,如果您这样做,它不起作用。


推荐阅读