JavaScript-合并两个对象数组并根据属性值进行重复数据删除

Sea*_*n O 5 javascript arrays object underscore.js

我想用另一个数组中的对象更新(替换)我的数组中的对象。每个对象具有相同的结构。例如

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}
];
Run Code Online (Sandbox Code Playgroud)

我已经尝试过concat()和Underscore的_.uniq函数,但是它总是转储较新的对象并从本质上返回原始数组。

有没有一种方法可以覆盖(替换)属性中匹配origArr的对象?updatingArrname

Mar*_*ell 7

我来这里正是为了寻找这一点,看到了@Gruff Bunny的技术,并且想知道“ lodash”是否不是“下划线”的最佳选择?

瞧瞧:

let result = _.unionBy(updatingArr, origArr, 'name');
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 6

你可以Array#map结合使用Array#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>');
Run Code Online (Sandbox Code Playgroud)


spa*_*man 5

使用double 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的例子