基于JavaScript中对象数组的布尔属性删除重复项和过滤

时间:2018-03-22 05:22:32

标签: javascript arrays javascript-objects

我有两个具有这些属性的对象数组:

<select [(ngModel)]="selectedValue">

我想删除包含false值标志的所有重复项,但两个重复项都有false标志,然后我只想保留其中一个。但是,如果任何对象没有任何重复,那么我想保留它,无论它的标志属性如何。我试过这个删除重复但不能通过flag属性进行过滤。

const a = [{name: 'Anna',email: 'anna@mac.com',flag: false},
  {name: 'Kelly',email: 'kelly@mac.com',flag: true}];
const b = [{name: 'Rana',email: 'rana@mac.com',flag: true},
  {name: 'Anna',email: 'anna@mac.com',flag: true},
  {name: 'Hank',email: 'Hank@mac.com',flag: false}];

预期输出将是这样的:

let cs = a.concat(b);
   cs = cs.filter((c, index, self) => 
index === self.findIndex((t) => (
    t.email === c.email  
))

3 个答案:

答案 0 :(得分:1)

有关详细信息,请参阅MapArray.prototype.map()Array.prototype.filter()

&#13;
&#13;
// A.
const A = [{name: 'Anna',email: 'anna@mac.com',flag: false}, {name: 'Kelly',email: 'kelly@mac.com',flag: true}]
  
// B.
const B = [{name: 'Rana',email: 'rana@mac.com',flag: true}, {name: 'Anna',email: 'anna@mac.com',flag: true}, {name: 'Hank',email: 'Hank@mac.com',flag: false}]

// Unique Users.
const uniqueUsers = (...arrays) => [...new Map([].concat.apply([], arrays).map(user => [user.email.toLowerCase(), user])).values()]

// Proof.
const C = uniqueUsers(A, B)
console.log(C)

// Optional Filtration By Flag.
const D = C.filter(user => user.flag)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您似乎已经知道a不包含重复项,b不包含重复项。所以你可以使用

const a = [{name: 'Anna',email: 'anna@mac.com',flag: false},
  {name: 'Kelly',email: 'kelly@mac.com',flag: true}];
const b = [{name: 'Rana',email: 'rana@mac.com',flag: true},
  {name: 'Anna',email: 'anna@mac.com',flag: true},
  {name: 'Hank',email: 'Hank@mac.com',flag: false}];

const map = new Map();
for (const o of a) {
  map.set(o.email, o);
}
for (const o of b) {
  if (!map.has(o.email) || !map.get(o.email).flag)
    map.set(o.email, o);
  // else keep the one from a
}
return Array.from(map.values());

答案 2 :(得分:0)

使用reduce的另一种方法:

const a = [{name: 'Anna',email: 'anna@mac.com',flag: false}, {name: 'Kelly',email: 'kelly@mac.com',flag: true}];
const b = [{name: 'Rana',email: 'rana@mac.com',flag: true}, {name: 'Anna',email: 'anna@mac.com',flag: true}, {name: 'Hank',email: 'Hank@mac.com',flag: false}];

let resp = [].concat(a, b)
.reduce((acc, { name, email, flag }) => {
  if(!flag || acc.some(x => x.name == name && x.email == email)) return acc;
  return acc.concat({name, email, flag});
}, [])

console.log(resp);