在JS中编辑Reduce函数中的累加器对象?

问题描述 投票:0回答:2

我有这个代码片段,用于按关键字段进行分组。

它使用

reduce
函数,我理解代码,除了正在编辑函数的
result
或累加器的部分。

如果我要编写此代码,我将有一个外部空数组来将结果推送到而不是编辑函数中的对象。

代码按预期工作,但我想知道这是否是常见做法。

function groupBy(array, key) {
  return array.reduce((result, currentItem) => {
    const groupByKey = currentItem[key];

    // Create a new array for the key if it doesn't exist in the result
    if (!result[groupByKey]) {
      result[groupByKey] = [];
    }

    // Push the current item to the array of the corresponding key
    result[groupByKey].push(currentItem);

    return result;
  }, {});
}

// Example usage:
const data = [
  { id: 1, category: 'A' },
  { id: 2, category: 'B' },
  { id: 3, category: 'A' },
  { id: 4, category: 'C' },
  { id: 5, category: 'B' },
];
javascript reduce
2个回答
0
投票

我相信尝试保持你的函数pure确实是一个很好的做法,尽管在这种情况下,这并不是什么大问题,因为累加器的初始值是

{}
,一个已经构建的对象文字专门传递给那个
reduce

如果事先使用累加器,我会遇到问题,例如:

const data = {};

// some logic around data...

const reduce = array.reduce((acc, e) => { /* side-effects on acc */ }, data);

// data has changed

0
投票

使用现代 JavaScript,您可能会使用本机方法,而不是创建自己的石斑鱼。

const data = [
  { id: 1, category: 'A' },
  { id: 2, category: 'B' },
  { id: 3, category: 'A' },
  { id: 4, category: 'C' },
  { id: 5, category: 'B' },
];

console.log(Object.groupBy(data, ({category}) => category));

但是,它在某些浏览器(例如三星互联网或 safari)中具有有限的可用性

© www.soinside.com 2019 - 2024. All rights reserved.