繁体   English   中英

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

[英]Removing duplicates and filtering based on a boolean property from array of objects in JavaScript

我有两个具有以下属性的对象数组:

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}];

我想删除所有包含错误值标志的重复项,但是两个重复项都具有错误标志,那么我只想保留其中一个。 但是,如果任何对象没有任何重复项,那么无论它的flag属性如何,我都希望保留它。 我试过此操作以删除重复项,但无法通过flag属性进行过滤。

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

预期的输出将是这样的:

[{"name":"Anna","email":"anna@mac.com","flag":true},
{"name":"Kelly","email":"kelly@mac.com","flag":true}, 
{"name":"Rana","email":"rana@mac.com","flag":true},
{"name":"Hank","email":"Hank@mac.com","flag":false}]

有关更多信息,请参见MapArray.prototype.map()Array.prototype.filter()

 // 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) 

似乎您已经知道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());

另一种使用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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM