2014-09-20 68 views
0

所以我有兩個數據集。 mainData是我想要推送並顯示爲主數據集的數據。如何迭代對象數組並在推送新值時添加匹配值

// data set 1 
var mainData = [{name: "david", views: 2}, {name: "andrew", views: 2}]; 

// data set 2 
var newData = [{name: "andrew", views: 4}, {name: "david", views: 4}, {name: "chris", views: 2}]; 

第二個數據集是新的或傳入的數據,我想做兩件事之一。我想搜索主數據集並查看是否有任何鍵匹配,如果是這樣,我只是想將視圖添加到具有相同name的對象。如果name鍵不匹配mainData中的任何對象,我想將該對象推送到mainData

我最後mainData應該是這樣的:

[{name: "david", views: 6}, {name: "andrew", views: 6}, {name: "chris", views: 2}] 

注意如何davidandrew現在有6,同時chris沒有匹配的對象中的值,並簡單地推。在純Javascript中實現這個最有效的方法是什麼?

+0

請張貼您的代碼。 – 2014-09-20 16:47:42

回答

0

如果你想在處理過程中清空newData做:

while (newData.length) { 
    var nd = newData.shift(), nam = nd.name, vie = nd.view; 
    if (!mainData.some(function(md) { 
     if (md.name === nam) {md.view += vie; return true;} 
    })) mainData.push(nd); 
} 

不然,如果newData對象應呆在那裏做

newData.forEach(function(nd) { 
    var nam = nd.nam, vie = nd.view; 
    if (!mainData.some(function(md) { 
     if (md.name === nam) {md.view += vie; return true;} 
    })) mainData.push(nd); 
}); 

在這兩種情況下mainData.some超過mainData()迭代。它的回調函數在每個步驟中檢查名稱屬性是否是標準的。如果是這樣,添加視圖屬性,回調返回true(=「找到匹配的名稱」),迭代停止。否則,回調沒有任何迴應,迭代繼續。由於some()處於否定條件之內,因此mainData.push()僅在some()找不到匹配時纔會發生。

Array.forEach()some()非常快。如果它們不可用,則必須使用效率較低的for-loops

+0

謝謝,這個作品。抱歉,我無法儘快回覆您! – David 2014-09-24 13:58:59

相關問題