使用if和方括号表示法了解reduce函数

时间:2019-03-21 02:47:54

标签: javascript square-bracket array-reduce

请解释代码,并详细说明代码背后的内容。

我对if(! acc[key])部分感到困惑。这是否意味着如果key不位于acc中并使用值数组设置密钥并跳出if语句并将obj推入acc键值?

如果密钥在acc中,则跳过if语句,并使用另一个内存acc[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))

1 个答案:

答案 0 :(得分:1)

if (!acc[key]) {...}只是在检查您是否已经在累加器中捕获了该键的任何数据。如果那里什么都没有,您可以在acc[key] = [];处放置一个空数组,以便在下一步中将数据压入其中。

代码中的错误是您还在if子句中包含了push;这意味着您将仅获得给定键的每个值的第一个对象。相反,您需要 all 该键的每个值的对象。

这是一个修复程序,代码中包含一些注释,解释了每个步骤的作用:

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

function groupBy(objectArray, property) {
  return objectArray.reduce(function(acc, obj) {
    // stepping through each object in the array:
    var key = obj[property]; // "key" is the value of the given property
                             // for this object
    if (!acc[key]) {         // if the accumulator doesn't already have
                             // data for that key,
      acc[key] = [];         // put an empty array there, so we can add
                             // data to it
    }
    // this next line was moved out of the if clause above it, because
    // you always want it to happen:
    acc[key].push(obj)       // push this object onto the accumulator 
                             // at that key
    return acc;              
  }, {});
}
var groupedPeople = groupBy(people, 'age')
console.log(JSON.stringify(groupedPeople))