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