使用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 来:
用具有来自 array_two 的匹配 ID 的对象覆盖 array_one 中的所有对象。
将 array_two 中的所有对象追加到 array_one 中,如果那里已经不存在具有其 ID 的其他对象。
被覆盖的对象应该在数组中保留它们的索引
附加对象必须添加到数组末尾
所以最终结果如下:
"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>
我有两个数组:
"array_one":
[
{
"id": 1,
"name": One
},
{
"id": 2,
"name": Two
}
]
"array_two":
[
{
"id": 1,
"name": Uno
},
{
"id": 3,
"name": Three
}
]
我需要使用 Underscore 来:
用具有来自 array_two 的匹配 ID 的对象覆盖 array_one 中的所有对象。
将 array_two 中的所有对象追加到 array_one 中,如果那里已经不存在具有其 ID 的其他对象。
被覆盖的对象应该在数组中保留它们的索引
附加对象必须添加到数组末尾
所以最终结果如下:
"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>