Понимание функции сокращения с помощью if и скобки - PullRequest
1 голос
/ 21 марта 2019

Пожалуйста, объясните код и уточните, что скрывается за кодом.

Я путаюсь с частью if(! acc[key]). Означает ли это, что если ключ не в acc и установить ключ с массивом значений, выпрыгнуть из оператора if и вставить obj в значение ключа acc?

В случае, если ключ находится в соответствии, пропустите оператор if и используйте другую память acc[key] и установите ключ в соответствии и установите значение с помощью 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 Ответ

1 голос
/ 21 марта 2019

if (!acc[key]) {...} просто проверяет, захватили ли вы уже какие-либо данные для этого ключа в аккумуляторе. Если там еще ничего нет, вы помещаете туда пустой массив с acc[key] = [];, чтобы на следующем шаге вы могли вставить в него данные.

Ошибка в вашем коде заключается в том, что вы также включаете push в условие if; это означает, что вы получите только первый объект для каждого значения для данного ключа. Вместо этого вы хотите все объекты для каждого значения для этого ключа.

Вот исправление, с некоторыми комментариями в коде, объясняющими, что он делает на каждом шаге:

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))
...