Array.Push会覆盖以前的Value Node Js

时间:2017-04-14 10:36:13

标签: 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.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("data added with id)...正在正确打印所有内容,理想情况下我想为现有数据添加一个新值,这是一个json数据,新值的名称是{{1正如我所看到的那样,哪个值必须完全不同。

以下是我之后如何获得这些物品。

eachUserId

此处 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); } } 方法会覆盖每个值?

3 个答案:

答案 0 :(得分:3)

<强>问题:

问题在于您将值eachUserId分配给对象data。您只有一个名为data的对象,并且您将这个相同的对象一遍又一遍地添加到数组中。但是请记住它们都引用同一个对象,当你改变该对象中的任何内容时,它将反映在任何地方

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

<强>解决方案:

您需要克隆该对象,然后将其推入数组。

我建议您使用lodash库和cloneDeep方法创建对象的深层克隆。

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);
});

答案 1 :(得分:0)

您确定comments是否包含所需数据。将其包裹在closure内,以便创建new scope for each iteration并传递正确的数据。

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))
    }

答案 2 :(得分:0)

使用传播运算符,它已经是第4阶段(ECMAScript

const foo = {}

const bar = {...foo}

foo.a = 1;
bar.a = 10;

console.log(foo) // {a : 1}
console.log(bar) // {a : 10}