如何在推送新值的同时迭代对象数组并添加匹配值

时间:2014-09-20 15:22:15

标签: javascript arrays regex object

所以我有两个数据集。 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中实现这一目标的最有效方法是什么?

1 个答案:

答案 0 :(得分: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()在否定条件内,因此只有在some()找不到匹配项时才会发生mainData.push()。

Array.forEach()some()非常快。如果它们不可用,则必须使用效率较低的for-loops