[英]How do I retrieve a list of active items from an Array?
我正在嘗試列出僅擁有活躍興趣並且角色為“ A”型的員工。
我嘗試使用以下查詢,但未成功。
我究竟做錯了什么?
// Get all the employees with active hobbies and have a role of 'A' var employees = people.find(item => item.key === 'Employees').employees.map(emp => emp.hobbies).filter(hobby => hobby.filter(h => h.active === true && h.roles.includes('A'))); console.log(employees);
<script> var people = [{ key: 'Employees', employees: [{ name: 'joe', age: 20, hobbies: [{ 'active': true, name: 'skating', roles: ['C', 'A'] }] }, { name: 'amy', age: 32, hobbies: [{ 'active': true, name: 'surfing', roles: ['A'] }] }, { name: 'kate', age: 34, hobbies: [{ 'active': true, name: 'running', roles: ['C'] }, { name: 'Chess', active: false, roles: ['C', 'A'] }] } ] }]; </script>
更新資料
當我向陣列中添加更多具有新愛好的員工時,被接受的答案無法產生正確的輸出。 為什么會這樣?
var people = [{
key: 'Employees',
employees: [{
name: 'Steve',
age: 50,
hobbies: [{
active: true,
name: 'skating',
roles: ['C', 'A']
},
{
active: false,
name: 'skating',
roles: ['C', 'A']
},
{
active: true,
name: 'snooker',
roles: ['C', 'A']
},
{
active: true,
name: 'darts',
roles: ['C', 'A']
}
]
},{
name: 'joe',
age: 20,
hobbies: [{
active: true,
name: 'skating',
roles: ['C', 'A']
}
]
}, {
name: 'amy',
age: 32,
hobbies: [{
'active': true,
name: 'surfing',
roles: ['A']
}
]
}, {
name: 'kate',
age: 34,
hobbies: [{
active: true,
name: 'running',
roles: ['C']
}, {
name: 'Chess',
active: false,
roles: ['C', 'A']
}
]
}
]
}
];
var employees = people.find(item => item.key === 'Employees').employees.filter(employee => employee.hobbies.every(h => h.active && h.roles.includes('A')));
如果您這樣做:
.map(emp => emp.hobbies).filter(hobby =>
您將每個員工映射到其興趣愛好,從而將結果填充為2D
數組:
[[ { active: true }, { active: false } ], [/*...*/]]
因此, hobby
不是一種愛好,而是一系列愛好。
你說
我正在嘗試獲取員工名單
......這意味着你其實不想.map
的愛好,而是.filter
員工,並檢查是否ever
愛好fullfills一定的規則:
const employees = people.find(({ key }) => key === "Employees").employees;
const isActive = hobby => hobby.active && hobby.roles.includes("A");
const result = employees.filter(emp => emp.hobbies.every(isActive));
當您將員工映射到他們的興趣愛好時,事情會出錯:這將使您的最終結果由興趣愛好而不是員工組成。
您需要堅持員工級別:
var people = [{key: 'Employees',employees: [{ name: 'joe', age: 20, hobbies: [{'active': true, name: 'skating', roles: ['C', 'A'] }] },{ name: 'amy', age: 32, hobbies: [{'active': true, name: 'surfing', roles: ['A'] }] }, { name: 'kate', age: 34, hobbies: [{'active': true, name: 'running', roles: ['C']}, {name: 'Chess', active: false, roles: ['C','A']}] }]}]; var employees = people.find(item => item.key === 'Employees').employees .filter(employee => employee.hobbies.every(h => h.active && h.roles.includes('A'))); console.log(employees);
在表達式中,無需將布爾屬性與true
進行比較。 只需使用該屬性(在這種情況下為active
)即可。
如果要求員工至少有一個這樣的愛好,請使用.some
而不是.every
,而不是要求所有愛好都符合條件。
.map(emp => emp.hobbies)
返回興趣愛好的數組,因此, employees
的價值將是興趣愛好的過濾列表,而不是擁有這些興趣愛好的員工。 您需要過濾員工,而不是映射他們。
// Get all the employees with active hobbies and have a role of 'A' var employees = people.find(item => item.key === 'Employees').employees.filter(emp => emp.hobbies.every(h => h.active && h.roles.includes('A'))); console.log(employees);
<script> var people = [{ key: 'Employees', employees: [{ name: 'joe', age: 20, hobbies: [{ 'active': true, name: 'skating', roles: ['C', 'A'] }] }, { name: 'amy', age: 32, hobbies: [{ 'active': true, name: 'surfing', roles: ['A'] }] }, { name: 'kate', age: 34, hobbies: [{ 'active': true, name: 'running', roles: ['C'] }, { name: 'Chess', active: false, roles: ['C', 'A'] }] } ] }]; </script>
您只需對Array.prototype.filter
進行一次調用即可檢查您提到的條件:
person.hobbies.every(y => y.active) && person.hobbies.every(z => z.roles.includes('A'))
var people = [{ key: 'Employees', employees: [{ name: 'joe', age: 20, hobbies: [{ 'active': true, name: 'skating', roles: ['C', 'A'] }] }, { name: 'amy', age: 32, hobbies: [{ 'active': true, name: 'surfing', roles: ['A'] }] }, { name: 'kate', age: 34, hobbies: [{ 'active': true, name: 'running', roles: ['C'] }, { name: 'Chess', active: false, roles: ['C', 'A'] }] } ] }]; let employees = people[0].employees.filter(x => x.hobbies.every(y => y.active) && x.hobbies.every(z => z.roles.includes('A')) ) console.log(employees);
您可以使用map
和filter
:
var people = [{ key: 'Employees', employees: [{ name: 'joe', age: 20, hobbies: [{ 'active': true, name: 'skating', roles: ['C', 'A'] }] }, { name: 'amy', age: 32, hobbies: [{ 'active': true, name: 'surfing', roles: ['A'] }] }, { name: 'kate', age: 34, hobbies: [{ 'active': true, name: 'running', roles: ['C'] }, { name: 'Chess', active: false, roles: ['C', 'A'] }] } ] }]; const result = people.filter(x => x.key == 'Employees') .map(({employees}) => employees.filter(x => x.hobbies.some(y => y.active && y.roles.includes('A')))) console.log(result)
您還可以使用reduce
& filter
:
var people = [{ key: 'Employees', employees: [{ name: 'joe', age: 20, hobbies: [{ 'active': true, name: 'skating', roles: ['C', 'A'] }] }, { name: 'amy', age: 32, hobbies: [{ 'active': true, name: 'surfing', roles: ['A'] }] }, { name: 'kate', age: 34, hobbies: [{ 'active': true, name: 'running', roles: ['C'] }, { name: 'Chess', active: false, roles: ['C', 'A'] }] } ] }]; const result = people.filter(x => x.key == 'Employees').reduce((r,{employees}) => { r.push(employees.filter(x => x.hobbies.some(y => y.active && y.roles.includes('A')))) return r }, []) console.log(result)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.