2017-04-14 177 views
0

美好的一天。 我有一個全球陣列,它必須是全球性的。Array.Push覆蓋以前的值節點Js

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()方法會覆蓋每個值?

回答

2

問題:

您的問題是,當你的價值分配給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); 
}); 
+0

驚人!最好的解決方案,它的工作就像一個魅力! –

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

這不是我想要的東西......我只是想一個數據添加到現有的JSON對象並將其插入到數組,這不是解決我的問題 –