用括号键缩小功能

时间:2019-03-21 01:53:49

标签: javascript arrays object ecmascript-6

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

if(!acc[key])

这是我对这行的解释:

如果key不在acc中,则用值数组设置key并跳出if语句。然后按obj键值中的acc

如果key位于acc中,请跳过if语句并使用另一个内存acc[key]并设置key中的acc并进行设置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))

2 个答案:

答案 0 :(得分:3)

方括号[]用于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))

答案 1 :(得分:1)

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

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

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