簡體   English   中英

使用多個條件檢查數組中的任意兩個 object 是否相等

[英]Check any two object in an array are Equal using multiple Conditions

在我的 angular 項目中,我有一個像

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

我需要根據多個條件檢查任何兩行或多行數據是否相同。 例如:如果任何兩行具有相同的年齡、性別和角色,則返回它們的名稱

所以預期的 Output 將是

[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);

我會使用一個助手 function 對數據進行適當的分組,並傳遞給它一個 function 從重要數據中生成一個唯一鍵。 像這樣的東西:

 // 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似乎使問題更加清晰。

這將返回一個由 arrays 對象組成的數組。 如果您只想要他們的名字,很容易添加.map (group => group.map (record => record.name)) .flatMap或者,將初始.map替換為單個數組失去對多個組進行報告的潛力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM