美好的一天。
我有一个全局数组,它必须是全局的。

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数据)添加新值,并且新值的名称为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);
        }
    }


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

最佳答案

问题:

您的问题是当您将eachUserId的值分配给对象data时。您只有1个名为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);
});

09-13 02:06