Когда вы делаете
console.log(obj[key])
, вы не знаете, имеет ли объект указанный ключ или нет;в конце концов, только после можно присвоить массив этому ключу, если нет связанного значения:
if(obj[key] === undefined){
obj[key] = [];
}
Итак, на каждой итерации, если ключ, который повторяется, имеетеще не был помещен в объект, он будет регистрировать undefined
, и позже на той же итерации этому ключу объекта будет присвоен пустой массив.
Например, на первой итерации i
равно 1.3
, поэтому сгенерированный ключ равен let key = inputFunc(i);
-> let key = inputFunc(1.3);
-> let key = 1
.Но объект начинается без ключей вообще, поэтому
obj[1]
оценивается как undefined
, более поздний оператор if
обнаруживает это и назначает массив этому ключу:
if(obj[key] === undefined){
obj[key] = [];
}
на первой итерации разрешается в
if(obj[1] === undefined){
obj[1] = [];
}
// ->
if(undefined === undefined){
obj[1] = [];
}
Вы также можете рассмотреть возможность использования reduce
, что более функционально и, возможно, более уместно при преобразовании массива в единственное значение:
const groupBy = (array, inputFunc) => array.reduce((a, elm) => {
const key = inputFunc(elm);
if (!a[key]) {
a[key] = [];
}
a[key].push(elm);
return a;
}, {});
const decimals = [1.3, 2.1, 2.4];
const floored = function(num) { return Math.floor(num); };
console.log(groupBy(decimals, floored)); // should log: { 1: [1.3], 2: [2.1, 2.4] }