Javascript - функция группировки с методом уменьшения - PullRequest
0 голосов
/ 23 февраля 2020

Может кто-нибудь объяснить пошагово следующую функцию? Я потерял его, когда начинается тело сокращения:

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

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

let groupedPeople = groupBy(people, 'age')

1 Ответ

1 голос
/ 23 февраля 2020

reduce делает эту функцию более сложной, чем на самом деле. (reduce чрезмерно используется, и почти всегда неправильный инструмент по сравнению с простым l oop.) Вот та же функция без лишних reduce, с объяснением:

function groupBy(objectArray, property) {
  // The object we'll return with properties for the groups
  let result = {}
  // Loop through the array
  for (const obj of objectArray) {
    // Get the key value
    let key = obj[property]
    // If the result doesn't have an entry for that yet, create one
    if (!result[key]) {
      result[key] = []
    }
    // Add this entry to that entry
    result[key].push(obj)
  }
  // Return the grouped result
  return result
}

reduce версия просто передает result (как acc): reduce вызывает обратный вызов с начальным значением ({}, которое вы видите в конце вызова reduce) и первой записью, которая является обратным вызовом получает как acc и obj. Затем обратный вызов выполняет работу одной записи и возвращает acc, что означает, что он получает ее снова при следующем проходе.

...