Javascript Push覆盖上一个值节点Js

Javascript Push覆盖上一个值节点Js,javascript,arrays,node.js,loops,push,Javascript,Arrays,Node.js,Loops,Push,你好。 我有一个全局数组,它必须是全局数组 var comments= []; 我有一个套接字的回调,我在其中迭代并添加值 更好地使用代码: socket.on('commentAdded', function (data) { if (data !== null) { var stringify = JSON.stringify(data); var json = JSON.parse(stringify); Object.k

你好。 我有一个全局数组,它必须是全局数组

var comments= [];
我有一个套接字的回调,我在其中迭代并添加值

更好地使用代码:

    socket.on('commentAdded', function (data) {
    if (data !== null) {
        var stringify = JSON.stringify(data);
        var json = JSON.parse(stringify);

        Object.keys(users).forEach(function (key) {
            if (key !== "null") {
                data.eachUserId = key;
                console.log("data added with id " + key + " the size of comments is " + comments.size);
                comments.push(data);
            }
        });
        console.log("comment was added");
    }

    socket.broadcast.emit('onCommentAdded', data);
});
这里我的
console.Log(“添加id的数据)…
正确地打印了所有内容,理想情况下,我想在现有数据中添加一个新值,它是一个json数据,新值的名称是
eachUserId
,正如您所看到的那样,这个值必须与我在循环中所做的完全不同

这是我之后如何得到这些物品的

   for (var f = 0; f < Object.keys(comments).length; f++) {
        var comment = comments[f];
        var eachUserId = comment.eachUserId;
        console.log("checking with current user id" + userId + " each user id" + eachUserId + " or each user id in [] way " + comment['eachUserId']);
        if (eachUserId === userId) {
            socket.emit('onCommentAdded', comment);
        }
    }
for(var f=0;f

这里,eachUserId始终是最后一个添加到循环中的项……我做错了什么?为什么是
push()
方法是否覆盖每个值?

是否确定您的
注释
包含所需数据。将其包装在
闭包
中,以便为每个迭代创建一个
新范围
,并传递正确的数据

for (var f = 0; f < Object.keys(comments).length; f++) {
       (function(f){
          var comment = comments[f];
          var eachUserId = comment.eachUserId;
          console.log("checking with current user id" + userId + " each user id" + eachUserId + " or each user id in [] way " + comment['eachUserId']);
          if (eachUserId === userId) {
             socket.emit('onCommentAdded', comment);
          }
       )(f))
    }
for(var f=0;f
您是否确定您的
注释
包含所需数据。将其包装在
闭包
中,以便为每次迭代创建一个
新范围
,并传递正确的数据

for (var f = 0; f < Object.keys(comments).length; f++) {
       (function(f){
          var comment = comments[f];
          var eachUserId = comment.eachUserId;
          console.log("checking with current user id" + userId + " each user id" + eachUserId + " or each user id in [] way " + comment['eachUserId']);
          if (eachUserId === userId) {
             socket.emit('onCommentAdded', comment);
          }
       )(f))
    }
for(var f=0;f
问题:

问题是当您将值赋给
eachUserId
对象
data
时。您只有一个名为
data
的对象,并且您要将同一个对象反复添加到数组中。但请记住,它们都引用同一个对象,当您更改该对象中的任何内容时,它将反映到所有位置

因此,当您在循环中更改
data.eachUserId=key;
时,数组中的所有项都会更改。最后,所有项都包含您分配给它的最后一个
eachUserId

解决方案:

您需要克隆对象,然后将其推入阵列


我建议您使用库和方法来创建对象的深度克隆

var _ = require('lodash');  //require "lodash"

socket.on('commentAdded', function (data) {
    if (data !== null) {        
        Object.keys(users).forEach(function (key) {
            if (key !== "null") {
                var dataClone = _.cloneDeep(data);  //create deep clone
                dataClone.eachUserId = key;         //assign "key"
                comments.push(dataClone);           //push into the array
            }
        });
        console.log("comment was added");
    }    
    socket.broadcast.emit('onCommentAdded', data);
});

问题:

问题是当您将值赋给
eachUserId
对象
data
时。您只有一个名为
data
的对象,并且您要将同一个对象反复添加到数组中。但请记住,它们都引用同一个对象,当您更改该对象中的任何内容时,它将反映到所有位置

因此,当您在循环中更改
data.eachUserId=key;
时,数组中的所有项都会更改。最后,所有项都包含您分配给它的最后一个
eachUserId

解决方案:

您需要克隆对象,然后将其推入阵列


我建议您使用库和方法来创建对象的深度克隆

var _ = require('lodash');  //require "lodash"

socket.on('commentAdded', function (data) {
    if (data !== null) {        
        Object.keys(users).forEach(function (key) {
            if (key !== "null") {
                var dataClone = _.cloneDeep(data);  //create deep clone
                dataClone.eachUserId = key;         //assign "key"
                comments.push(dataClone);           //push into the array
            }
        });
        console.log("comment was added");
    }    
    socket.broadcast.emit('onCommentAdded', data);
});

使用扩展运算符,它已处于第4阶段()

constfoo={}
常量条={…foo}
foo.a=1;
bar.a=10;
console.log(foo)/{a:1}

console.log(bar)/{a:10}
使用扩展运算符,它已经是第4阶段()

constfoo={}
常量条={…foo}
foo.a=1;
bar.a=10;
console.log(foo)/{a:1}

console.log(bar)/{a:10}
这不是我想要的…我只是想向现有json对象添加一个数据并将其插入数组,这不是解决我的问题这不是我想要的…我只是想向现有json对象添加一个数据并将其插入数组,这不是解决我的问题!这是最好的解决方案,效果非常好!太棒了他找到了最好的解决方案,效果非常好!