![](/img/trans.png)
[英]How to merge two arrays of JSON objects - removing duplicates and preserving order in Javascript/jQuery?
[英]How to merge arrays of objects while removing duplicates
我需要比较两个对象数组并删除重复项并将它们合并为一个。 我对 javascript/Typescript 有点陌生。 我已经阅读了一些使用 Map、reduce、filter 来完成这项工作的博客。 这是正确的方法吗?
但是,我想知道是否可以创建它和 Map.ContainsKey 或 Map.getvalues() 的映射;
在实际问题中,对象非常庞大,有几个键,甚至数组有数百条记录。
[
{
Name: Roger
Country : spain
},
{
Name:Tiger
Counry : USA
},
{
Name: Micheal
Country: USA
},
]
[
{
Name: sachin
Country : India
},
{
Name:Roger
Counry : Spain
},
]
output
[
{
Name: Roger
Country : spain
},
{
Name:Tiger
Counry : USA
},
{
Name: Micheal
Country: USA
},
{
Name: sachin
Country : India
}
]
您可以将所需值的哈希表作为键,并在哈希表中推送没有标志的元素。
var array1 = [{ Name: 'Roger', Country: 'Spain' }, { Name: 'Tiger', Counry: 'USA' }, { Name: 'Micheal', Country: 'USA' }], array2 = [{ Name: 'sachin', Country: 'India' }, { Name: 'Roger', Country: 'Spain' }], hash = Object.create(null), result = [array1, array2].reduce(function (r, a) { a.forEach(function (o) { var key = ['Name', 'Country'].map(k => o[k]).join('|'); if (!hash[key]) { r.push(o); hash[key] = true; } }); return r; }, []); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
这是一种可能的解决方案:
// Step 1, concat the two arrays together.
const allItems = items1.concat(items2);
// Step 2, map the above into an array of key/value entries.
const entries = allItems.map(o => [`${o.Name}:${o.Country}`, o]);
// Step 3, create a Map on the entries. De-duping happens here.
const map = new Map(entries);
// Step 4, extract the map's values back into an array.
const result = [...map.values()];
有关此方法的一些注意事项:
concat()
中,顺序很重要! items2
items1
优先于items2
。 换句话说, allItems
数组末尾的项目具有优先权,因为Map
构造函数中的后续条目会覆盖先前的条目。 如果这些对象除了要比较的对象之外还具有其他属性,则这很重要。 :
字符,则很可能会发生冲突。 如果这成为问题,那么您可以幻想如何构建输入键。 Map
在后台使用哈希表,因此重复数据删除应该相当快。 Map
记住输入顺序,因此最终数组将反映与allItems
相同的顺序,但删除了重复项。 对于其他订单,您需要进行排序。 使用map()和filter()方法的基于 Es6 的解决方案。
合并两个对象数组并创建一个删除重复对象
let arr1 = [ { Name: 'Roger', Country : 'spain' }, { Name:'Tiger', Country : 'USA' }, { Name: 'Micheal', Country: 'USA' }, ]; let arr2 = [ { Name: 'sachin', Country : 'India' }, { Name:'Roger', Country : 'Spain' }, ] let arr3 = [...arr1, ...arr2] function mergeUniqueArray(arr, comp) { let unique = arr .map(item => item[comp]) // store the keys of the unique objects .map((item, i, final) => final.indexOf(item) === i && i) // eliminate the duplicate keys & store unique objects .filter(item => arr[item]).map(item => arr[item]); return unique; } console.log(mergeUniqueArray(arr3,'Name'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.