![](/img/trans.png)
[英]Javascript - Check if two arrays are equal when arrays contain an object and an array
[英]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))
makeKey
和getProp
函數可以很容易地內聯。 但是打破groupBy
似乎使問題更加清晰。
這將返回一個由 arrays 對象組成的數組。 如果您只想要他們的名字,很容易添加.map (group => group.map (record => record.name))
.flatMap
或者,將初始.map
替換為單個數組失去對多個組進行報告的潛力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.