使用多个条件检查数组中的任何两个对象是否相等

问题描述 投票:-2回答:1

在我的角度项目中,我有一个类似的数据源

  [
    {id: "1", name: "John", age: "23", gender:"M", Role: "Student"},
    {id: "2", name: "Smith", age: "24", gender:"M", Role: "Teacher"},
    {id: "3", name: "Jeff", age: "23", gender:"M", Role: "Student"},
    {id: "4", name: "Ronald", age: "25", gender:"M", Role: "Teacher"},
    {id: "5", name: "Ronak", age: "23", gender:"M", Role: "Student"}
]

我需要根据多个条件检查两行或更多行数据是否相同。例如:如果任意两行的年龄和性别相同,并且角色相同,则返回其名称

因此预期输出将是

[John,Jeff, Ronak]

由于他们具有相同的年龄,性别和角色,其他

[]

我试图对数组进行分组,但是我没有找到使用多个条件对数组进行分组的任何解决方案,然后尝试了嵌套循环,但是效率低下,结果也不如预期。

javascript typescript angular7
1个回答
0
投票

您可以为想要的属性获取一个联接键,使组的名称缩合,并返回包含三个或更多项目的组中的所有名称。

var data = [{ id: "1", name: "John", age: "23", gender: "M", Role: "Student" }, { id: "2", name: "Smith", age: "24", gender: "M", Role: "Teacher" }, { id: "3",  name: "Jeff", age: "23", gender: "M", Role: "Student" }, { id: "4", name: "Ronald", age: "25", gender: "M", Role: "Teacher" }, { id: "5", name: "Ronak", age: "23", gender: "M", Role: "Student" }],
    keys = ['age', 'gender', 'Role'],
    groups = data.reduce((r, o) => {
        const key = keys.map(k => o[k]).join('|');
        r[key] = r[key] || [];
        r[key].push(o.name);
        return r;
    } , {}),
    result = Object.values(groups).flatMap(a => a.length >= 3 ? a : []);

console.log(result);
© www.soinside.com 2019 - 2024. All rights reserved.