Петля
A for
(императивный стиль), как у вас, вероятно, будет самой быстрой в большинстве ситуаций.Однако в этом случае вы вряд ли увидите большую разницу.Одна вещь, которую вы могли бы сделать, чтобы улучшить код в своем примере, - это получить длину массива до цикла for
и назначить его переменной, чтобы он не вычислялся на каждой итерации цикла.
const yearsObj = {};
const arrayLength = array.length; // Only calculate array length once
for (let i=0; i<arrayLength; i++) {
if (!yearsObj[array[i].year]) {
yearsObj[array[i].year] = [];
}
yearsObj[array[i].year].push(array[i]);
}
В этой ситуации я бы предпочел использовать Array.reduce()
.Это более читабельно, а разница в производительности будет незначительной.
const arr = [
{ name: 'greg', year: '2000' },
{ name: 'john', year: '2002' },
{ name: 'bob', year: '2005' },
{ name: 'ned', year: '2000' },
{ name: 'pam', year: '2000' },
];
const result = arr.reduce((prev, curr) => {
const { year } = curr;
if (prev[year]) {
prev[year].push(curr);
} else {
prev[year] = [curr];
}
return prev;
}, {});
/* Result:
{ '2000':
[ { name: 'greg', year: '2000' },
{ name: 'ned', year: '2000' },
{ name: 'pam', year: '2000' } ],
'2002': [ { name: 'john', year: '2002' } ],
'2005': [ { name: 'bob', year: '2005' } ] }
*/