我有两个具有这些属性的对象数组:
<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
))
答案 0 :(得分:1)
有关详细信息,请参阅Map,Array.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)
&#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);