我需要比较两个对象数组并删除重复数据并将它们合并为一个。 我是javascript / Typescript的新手。我已经阅读了一些使用Map,reduce,filter来完成这项工作的博客。 这是正确的做法吗?
但是,我想知道我是否可以创建它的地图以及Map.ContainsKey或Map.getvalues();
在真正的问题中,对象非常庞大,有几个键甚至数组都有数百条记录。
(cartBody).empty
答案 0 :(得分:1)
您可以将所需值的哈希表作为键,并在哈希表中推送没有标志的元素。
.as-console-wrapper { max-height: 100% !important; top: 0; }
$.ajax({
type: 'POST',
url: '/admin/menu',
data: new FormData(this),
processData: false,
contentType: false,
success: function (data) {
console.log(data);
},
error: function(data) {
console.error(data);
}
});
答案 1 :(得分: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
。换句话说,allItems
数组末尾的项优先,因为Map
构造函数中的后续条目会覆盖以前的条目。如果这些对象除了被比较的对象之外还有其他属性,这就很重要。:
字符,则可能会发生碰撞。如果这成为一个问题,你可以对如何构建入口密钥感到高兴。Map
在幕后使用哈希表,因此重复数据删除应该相当快。Map
会记住输入顺序,因此最终数组将反映与allItems
相同的顺序,但删除了重复项。对于不同的订单,您需要排序。答案 2 :(得分:0)
基于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'));