【问题标题】:Function that returns specified values, from an array of objects, if a property is true如果属性为真,则从对象数组返回指定值的函数
【发布时间】:2021-01-12 22:54:08
【问题描述】:

我正在处理一个挑战:给定一个对象数组,编写一个函数 admin,它返回所有标记为“admin”的用户的姓名和生日。

const users = [
  {
    name: 'Homer', 
    role: 'clerk', 
    dob: '12/02/1988',
    admin: false 
  }, 
  {
    name: 'Lisa', 
    role: 'staff', 
    dob: '01/30/1965',
    admin: false 
  }, 
  {
    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

【问题讨论】:

    标签: javascript function multidimensional-array javascript-objects


    【解决方案1】:

    如果您只想将它​​们记录到控制台,您可以简单地使用forEach()

    const users = [
      {
        name: 'Homer', 
        role: 'clerk', 
        dob: '12/02/1988',
        admin: false 
      }, 
      {
        name: 'Lisa', 
        role: 'staff', 
        dob: '01/30/1965',
        admin: false 
      }, 
      {
        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() 更改过滤后数组的元素,使其符合预期的输出。

    在下面的 sn-p admin() 返回一个只有 namedob 键的变异 user 对象数组。

    const users = [
      {
        name: 'Homer', 
        role: 'clerk', 
        dob: '12/02/1988',
        admin: false 
      }, 
      {
        name: 'Lisa', 
        role: 'staff', 
        dob: '01/30/1965',
        admin: false 
      }, 
      {
        name: 'Marge', 
        role: 'associate', 
        dob: '09/10/1980',
        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.admintrue 的元素。

    map(u => ({name: u.name, dob: u.dob})) 然后遍历过滤数组的每个元素,并将每个元素更改为仅包含传递对象的name:dob: 的对象。

    【讨论】:

    • 感谢您澄清了简单地将属性打印到屏幕和让 array.map 技术实际返回所需属性之间的区别。我现在只写了几个星期的代码,很高兴看到可以以不同方式显示数据的各种内置函数。感谢您的反馈和指导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2022-01-01
    • 2019-09-28
    • 2017-09-17
    • 2019-04-29
    • 2017-08-08
    相关资源
    最近更新 更多