【问题标题】:Reduce function with bracket key用括号键减少功能
【发布时间】:2019-08-11 20:24:46
【问题描述】:

我对以下代码行的含义感到困惑:

if(!acc[key])

这是我对这行的解释:

如果key不在acc中,则将key设置为value数组并跳出if语句。然后将obj推入acc键值。

如果keyacc中,跳过if语句并使用另一个内存acc[key]并设置keyacc中并使用obj设置值。 (需要大修)

我的解释正确吗?

var people = [{
    name: 'Alice',
    age: 21
  },
  {
    name: 'Max',
    age: 20
  },
  {
    name: 'Jane',
    age: 20
  }
];

function groupBy(objectArray, property) {
  return objectArray.reduce(function(acc, obj) {
    var key = obj[property];
    if (!acc[key]) {
      acc[key] = [];
      acc[key].push(obj)
    }
    return acc;

  }, {});
}
var groupedPeople = groupBy(people, 'age')
console.log(JSON.stringify(groupedPeople))

【问题讨论】:

    标签: javascript arrays object ecmascript-6


    【解决方案1】:

    方括号[] 用于dynamic property notation(也称为计算属性名称)。是这样的:

    var obj = { foo: "bar" };
    var propertyWeWant = "foo"; //We want to get obj.foo - the value "bar"
    console.log(obj.propertyWeWant); //Returns undefined
    console.log(obj[propertyWeWant]); //Returns bar
    

    函数groupBy 接受一个人数组,并返回按传递的属性分组的人(在本例中为age):

    var people = [{
        name: 'Alice',
        age: 21
      },
      {
        name: 'Max',
        age: 20
      },
      {
        name: 'Jane',
        age: 20
      }
    ];
    
    function groupBy(objectArray, property) {
      return objectArray.reduce(function(acc, obj) {
        var key = obj[property];
        if (!acc[key]) {
          acc[key] = [];
        }
        acc[key].push(obj)
        return acc;
    
      }, {});
    }
    var groupedPeople = groupBy(people, 'age')
    console.log(JSON.stringify(groupedPeople))

    【讨论】:

    • acc[key].push(obj) 应该超出if语句,否则没有意义。
    • if(!acc[key]) 是什么意思
    • 为什么结果是从 20 而不是 21 开始
    【解决方案2】:

    !acc[key] 表示如果key 属性(它是动态的,就像@Jack Bashford 所说的那样)在对象acc 中不存在,它将返回falsereduce 将起作用

    1. acc 使用 {}
    2. 初始化
    3. 循环进入第一个对象:key = '21',但acc['21']undefined 运行if 的块代码
    4. 2nd: key = '20' and !acc[key] return true ~> 设置acc['20'] = obj
    5. 最后一个对象。 key = '20',但 acc['20'] 在第 3 步有值 ~> 跳过块代码并返回 acc
    6. 返回acc 2 键“20”和“21”

    结果以 20 开头的原因是我认为浏览器想要打印按字母排序的对象的属性。

    【讨论】:

    • 请说明 acc[key].push(obj) 是否超出 if 子句并返回 acc
    • 首先,reduce实际上是一个循环,在reduce的回调函数中返回的值将用于下一次迭代。其次,acc[key].push(obj) 应该在 if 子句之外,因为 inside 仅适用于新的key 情况,如果您在此处使用该语句,则具有相同键的另一个对象将被忽略(Jane's object)。然后,您只需在 if 子句中初始化值 acc[key] = [] 并将对象推送到所有项目的键。最后返回新对象(return acc
    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多