问题描述
我正在解决一个挑战:给定一组对象,编写一个函数admin,该函数返回标记为“ admin”的所有用户的姓名和生日。
const users = [
{
name: 'Homer',role: 'clerk',dob: '12/02/1988',admin: false
},{
name: 'Lisa',role: 'staff',dob: '01/30/1965',{
name: 'Marge',role: 'associate',dob: '09/10/1980',admin: true
}
]
function admin(myObj) {
function groupBy(myObj,prop) {
return myObj.reduce(function (acc,obj) {
let key = obj[prop]
if (!acc[key]) {
acc[key] = []
}
acc[key].push(obj)
return acc
},{});
}
let trueAdmin = groupBy(myObj,'admin');
console.log(trueAdmin[true].map(({name,dob}) => `Name: ${name}
dob: ${dob}
`).join(`
`));
}
admin(users);
运行测试时,它以未定义形式返回,我不知道为什么。我正在寻找预期的输出: 管理员(用户)
// Name: Marge
// dob: 09/10/1980
解决方法
如果您只想将它们登录到控制台,则只需使用forEach()
const users = [
{
name: 'Homer',role: 'clerk',dob: '12/02/1988',admin: false
},{
name: 'Lisa',role: 'staff',dob: '01/30/1965',{
name: 'Marge',role: 'associate',dob: '09/10/1980',admin: true
}
]
function admin(myArray) {
myArray.forEach(user => {
if (user.admin) console.log(`Name: ${user.name},DOB: ${user.dob}`);
});
}
admin(users);
如果您想返回匹配的用户,可以使用filter()
返回由回调过滤的数组,然后map()
可以更改过滤后的数组的元素,使其符合预期输出。
在以下代码段中,admin()
返回仅包含user
和name
键的一组突变的dob
对象。
const users = [
{
name: 'Homer',admin: true
}
]
function admin(myArray) {
return myArray.filter(u => u.admin).map(u => ({name: u.name,dob: u.dob}));
}
console.log(admin(users));
filter(u => u.admin)
遍历每个对象,并返回一个包含user.admin
为true
的元素的数组。
map(u => ({name: u.name,dob: u.dob}))
然后遍历已过滤数组的每个元素,并将每个元素更改为仅包含所传递对象的name:
和dob:
的对象。