Понимание функции уменьшения с помощью обозначения if и скобок

#javascript #square-bracket #array-reduce

#javascript #квадратные скобки #массив-уменьшить

Вопрос:

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

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

В случае, если ключ if находится в 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. Код здесь не совсем работает; вы должны нажать на сгруппированный объект независимо от того, является ли он первым элементом или нет (переместить acc[key].push(obj) из условного блока).

2. спасибо, я скопировал это из своих практических кодов, поэтому забыл изменить код.

Ответ №1:

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