所以我有两个数据集。 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}]
请注意david
和andrew
现在的值是6,而chris
与任何对象都不匹配,只是被推送。在纯Javascript中实现这一目标的最有效方法是什么?
答案 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
。