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



在我的angular项目中,我有一个类似的DataSource

[
{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]

由于他们的年龄、性别和角色相同其他

[]

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

您可以为所需的属性获取一个联接键,收集组的名称,并返回包含三个或更多项的组中的所有名称。

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);
console.log(groups);

我会使用一个助手函数来适当地对数据进行分组,并向它传递一个函数,该函数从重要数据中生成一个唯一的键。类似这样的东西:

// Utility functions
const groupBy = (fn) => (xs) => 
xs .reduce ((a, x) => ({... a, [fn(x)]: [... (a [fn (x)] || []), x]}), {})
const getProp = (obj) => (prop) =>
obj [prop]
// Helper function
const makeKey = (props) => (record) =>
props .map (getProp (record)) .join('|')
// Main function
const multipleMatch = (props) => (data) => 
Object 
.values (groupBy (makeKey(props)) (data)) 
.filter (arr => arr.length > 1)
// Demos
const 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"}]
console .log (multipleMatch (['age', 'gender', 'Role']) (data))
// Changing the age of one to get two different shared groups
const data2 = [{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: "24", gender:"M", Role: "Teacher"}, {id: "5", name: "Ronak", age: "23", gender:"M", Role: "Student"}]
console .log (multipleMatch (['age', 'gender', 'Role']) (data2))

makeKeygetProp函数可以很容易地内联。但groupBy的爆发似乎让问题变得更加清晰。

这将返回对象数组的数组。如果您只想要它们的名称,可以很容易地使用.map (group => group .map (record => record .name)),或者,用.flatMap替换最初的.map,您可以获得单个阵列,但代价是失去了报告多个组的潜力。

最新更新