簡體   English   中英

如何從數組中檢索活動項目列表?

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

您可以使用mapfilter

 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) 

您還可以使用reducefilter

 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.

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