如何删除重复和过滤数组对象,如下所述

时间:2017-11-14 01:27:44

标签: javascript arrays ecmascript-6

let array1 = [{id:562,name:“Eva Bridal”},{id:582,name:“Finger Touch”},]

let array2 = [{id:575,name:“Saloon Grand”},{id:562,name:“Eva Bridal”}]

最终输出:

let newarray = [{id: 582, name: "Finger Touch"},{id: 575, name: "Saloon Grand"} ]

2 个答案:

答案 0 :(得分:2)

array1中的所有项目以及array2中未在array1中找到的项目添加到结果数组中。

这在数组文字中使用扩展语法,.filter()使用.find()来排除重复项。

let array1 = [{id: 562, name: "Eva Bridal"},{id: 582, name: "Finger Touch"},];

let array2 = [{id: 575, name: "Saloon Grand"} , {id: 562, name: "Eva Bridal"}];

var result = [
  ...array1.filter(o => !array2.find(o2 => o.id == o2.id)),
  ...array2.filter(o => !array1.find(o2 => o.id == o2.id))
];

console.log(result);

答案 1 :(得分:0)

我认为副本可以出现多次(即3个具有相同ID的项目)。如果是这种情况,您可以使用Set来保留现有ID。 Concat两个数组,并使用reduce创建Map。如果集合中存在项目id,请将其从地图中删除,如果没有将该项目添加到地图中,则将其id添加到集合中。当reduce过程结束时,将Map valuesspread放到数组中:



const array1 = [{id: 562, name: "Eva Bridal"},{id: 582, name: "Finger Touch"}]

const array2 = [{id: 575, name: "Saloon Grand"}, {id: 562, name: "Eva Bridal"}]

const existing = new Set();
const result = [...array1.concat(array2).reduce((r, o) => {
  if(existing.has(o.id)) {
    r.delete(o.id);
  } else {
    existing.add(o.id);
    r.set(o.id, o);
  }

  return r;
}, new Map).values()];

console.log(result);




如果您确定只有成对的重复项目(即 - 不超过2项具有相同的id),请仅使用地图,并删除地图中已存在的项目:



const array1 = [{id: 562, name: "Eva Bridal"},{id: 582, name: "Finger Touch"}]

const array2 = [{id: 575, name: "Saloon Grand"}, {id: 562, name: "Eva Bridal"}]

const result = [...array1.concat(array2).reduce((r, o) => {
  if(r.has(o.id)) {
    r.delete(o.id);
  } else {
    r.set(o.id, o);
  }

  return r;
}, new Map).values()];

console.log(result);