2016-05-05 49 views
2

我想更新(替换)我的数组中的对象与另一个数组中的对象。每个对象具有相同的结构。例如JavaScript - 合并两个对象数组并根据属性值去重复

var origArr = [ 
    {name: 'Trump', isRunning: true}, 
    {name: 'Cruz', isRunning: true}, 
    {name: 'Kasich', isRunning: true} 
]; 
var updatingArr = [ 
    {name: 'Cruz', isRunning: false}, 
    {name: 'Kasich', isRunning: false} 
]; 
// desired result: 
NEWArr = [ 
    {name: 'Trump', isRunning: true}, 
    {name: 'Cruz', isRunning: false}, 
    {name: 'Kasich', isRunning: false} 
]; 

我试过CONCAT()&下划线的_.uniq功能,但它总是转储新对象&回报,从本质上讲,原来的阵列。

有没有办法用updatingArr中的对象覆盖(替换)origArr - 匹配name属性?

+1

这就是你是什么意思? https://jsfiddle.net/4p98w3su/不知道我明白了这个问题。 – spaceman

+0

这里所有的好答案;我喜欢你最好的,使用拼接。如果您想将其转换为答案,我会将其标记为已接受。谢谢。 –

+0

我把它作为答案,我认为它也比涉及map&reduce的方法更快。在一段时间内运行数百万次后,我的速度提高了两倍。 – spaceman

回答

3

使用双for循环和拼接,你可以做到这一点,像这样:

for(var i = 0, l = origArr.length; i < l; i++) { 
    for(var j = 0, ll = updatingArr.length; j < ll; j++) { 
     if(origArr[i].name === updatingArr[j].name) { 
      origArr.splice(i, 1, updatingArr[j]); 
      break; 
     } 
    } 
} 

here

1

这将你需要的东西:

var origArr = [ 
 
    {name: 'Trump', isRunning: true}, 
 
    {name: 'Cruz', isRunning: true}, 
 
    {name: 'Kasich', isRunning: true} 
 
]; 
 

 
var updatingArr = [ 
 
    {name: 'Cruz', isRunning: false}, 
 
    {name: 'Kasich', isRunning: false} 
 
]; 
 

 
for (var i = 0; i < updatingArr.length; ++i) { 
 
    var updateItem = updatingArr[i]; 
 
    for (var j = 0; j < origArr.length; ++j) { 
 
    var origItem = origArr[j]; 
 
    if (origItem.name == updateItem.name) { 
 
     origItem.isRunning = updateItem.isRunning; 
 
     break;  
 
    } 
 
    } 
 
} 
 

 
document.write('<pre>' + JSON.stringify(origArr, 0, 4) + '</pre>');

2

你可以结合使用Array#mapArray#reduce

var origArr = [{ name: 'Trump', isRunning: true }, { name: 'Cruz', isRunning: true }, { name: 'Kasich', isRunning: true }], 
 
    updatingArr = [{ name: 'Cruz', isRunning: false }, { name: 'Kasich', isRunning: false }], 
 
    NEWArr = origArr.map(function (a) { 
 
     return this[a.name] || a; 
 
    }, updatingArr.reduce(function (r, a) { 
 
     r[a.name] = a; 
 
     return r; 
 
    }, Object.create(null))); 
 

 
document.write('<pre>' + JSON.stringify(NEWArr, 0, 4) + '</pre>');

2

您可以使用散列给出索引的名称,并Object.assign进行更新。

var hash = origArr.reduce(function(hash, obj, index) { 
    hash[obj.name] = index; 
    return hash; 
}, Object.create(null)); 
for(var obj of updatingArr) { 
    Object.assign(origArr[hash[obj.name]], obj); 
} 
2

您可以试试这个。

var origArr = [ 
    {name: 'Trump', isRunning: true}, 
    {name: 'Cruz', isRunning: true}, 
    {name: 'Kasich', isRunning: true} 
]; 
var updatingArr = [ 
    {name: 'Cruz', isRunning: false}, 
    {name: 'Kasich', isRunning: false} 
]; 

var origLength = origArr.length; 
var updatingLength = updatingArr.length; 

//Traverse the original array and replace only if the second array also has the same value 
for(i = origLength-1; i >= 0; i--) { 
    for(j = updatingLength -1; j >= 0; j--) { 
    if(origArr[i].name === updatingArr[j].name) { 
     origArr[i] = updatingArr[j]; 
    } 
    } 
} 

console.log(origArr); 
+0

遍历按照相反的顺序完成,因为根据jspref进行的测试,耗时最少 –

2

下面是使用下划线的解决方案:

var result = _.map(origArr, function(orig){ 
    return _.extend(orig, _.findWhere(updatingArr, {name: orig.name})); 
}); 
相关问题