使用JS Underscore对相似数组进行key合并排序

Using JS Underscore to merge and sort similar arrays by key

我有两个数组:

"array_one":
[
    {
    "id": 1,
    "name": One
     },
     {
     "id": 2,
     "name": Two
     }
]

"array_two":
[
    {
    "id": 1,
    "name": Uno
     },
     {
     "id": 3,
     "name": Three
     }
]

我需要使用 Underscore 来:

  1. 用具有来自 array_two 的匹配 ID 的对象覆盖 array_one 中的所有对象。

  2. 将 array_two 中的所有对象追加到 array_one 中,如果那里已经不存在具有其 ID 的其他对象。

  3. 被覆盖的对象应该在数组中保留它们的索引

  4. 附加对象必须添加到数组末尾

所以最终结果如下:

"array_final":
[
    {
    "id": 1,
    "name": Uno
     },
    {
    "id": 2,
    "name": Two
     },
     {
     "id": 3,
     "name": Three
     }
]

您可以使用两个对象作为哈希表,一个用于跟踪添加的对象,另一个用于第二个数组。然后,如果在第二个数组中找到对象,则使用 reduce 替换第一个数组中的对象,最后再使用一个 for 循环添加第二个数组中的其余对象。

var data = {
  "array_one": [{
    "id": 1,
    "name": 'One'
  }, {
    "id": 2,
    "name": 'Two'
  }],
  "array_two": [{
    "id": 1,
    "name": 'Uno'
  }, {
    "id": 3,
    "name": 'Three'
  }]
}

var obj = {}, added = {}
data.array_two.forEach(e => obj[e.id] = e)

var result = {finalArray: data.array_one.reduce(function(r, e) {
  r.push(obj[e.id] ? (added[e.id] = 1, obj[e.id]) : e);
  return r;
}, [])}

for(var i in obj) if(!added[obj[i].id]) result.finalArray.push(obj[i]) 

console.log(result)

var array1 = 
[
    {
    "id": 1,
    "name": 'One'
     },
     {
     "id": 2,
     "name": 'Two'
     }
];

var array2 = 
[
    {
    "id": 1,
    "name": 'Uno'
     },
     {
     "id": 3,
     "name": 'Three'
     }
];


function mapArrays(arr1, arr2) {
  
  var tmp = _.map(arr1, function(val) {
    var o = _.first(_.filter(arr2, function(a2) { return a2.id === val.id; }));
    return !!o ? o : val;
  });
  
  return _.union(tmp, _.filter(arr2, function(val) { return !_.some(tmp, function(a2) { a2.id == val.idl }); }));
}

var final = mapArrays(array1, array2);

console.log(final);
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>