当前位置: 首页 > 知识库问答 >
问题:

javascript - reduce按条件分组输出错误,为什么?

鲁鹤轩
2023-06-24

要求:

const people = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 35 },
  { name: 'David', age: 25 },
  { name: 'Emily', age: 30 }
];
// Output: {
//   25: [{ name: 'Alice', age: 25 }, { name: 'David', age: 25 }],
//   30: [{ name: 'Bob', age: 30 }, { name: 'Emily', age: 30 }],
//   35: [{ name: 'Charlie', age: 35 }]
// }

代码:

let fn = (arr = []) => {
  return arr.reduce((accumulator, currentValue) => {
    return accumulator[currentValue.age]
      ? (accumulator[currentValue.age] = accumulator[currentValue.age].concat(currentValue))
      : ((accumulator[currentValue.age] = [currentValue]));
  }, {});
};

const people = [
  { name: 'Alice', age: 25 },
  { name: 'Bob', age: 30 },
  { name: 'Charlie', age: 35 },
  { name: 'David', age: 25 },
  { name: 'Emily', age: 30 }
];

console.log(fn(people));

输出:
[ { name: 'Emily', age: 30 } ]

共有1个答案

谈炳
2023-06-24

你的错误在于三元表达式返回的值是数组,而你把这个数组再返回了,导致下一次接受的 accumulator 是数组而不是对象,原对象的信息实际上已经丢失。

function reduceByAge(list = []){
  return list.reduce(( reduced, presentItem ) => {
    // 获取当前条目的年龄信息
    const { age } = presentItem;

    // 已经有对应年龄的列表,则获取并命名为 subList
    // 没有的话,就给 subList 赋值空数组
    const { [age]: subList = [] } = reduced;

    // 添加当前条目到数组
    subList.push(presentItem);

    // 添加到已归并的对象中去
    reduced[age] = subList;
    return reduced;
  }, {});
}
 类似资料:
  • 我一直在尝试一些组件,这些组件执行react-cache风格的事情,并在render方法中执行web服务调用,将promise抛出到React.Suspense组件,并在数据存在时重新呈现。它们调用web服务,检查响应,并根据响应呈现或抛出错误到错误边界。我注意到,每当在组件中抛出错误时,它都会呈现两次。第一次callstack看起来正常,第二次callstack包括对invokeGuardedC

  • 本文向大家介绍为什么JavaScript的“ var null”抛出错误而“ var undefined”没有抛出错误?,包括了为什么JavaScript的“ var null”抛出错误而“ var undefined”没有抛出错误?的使用技巧和注意事项,需要的朋友参考一下 Web浏览器会抛出“ var null”错误,因为它是保留的标识符。 您不能在ECMAScript中使用以下文字作为标识符-

  • Liquibase状态失败:无法从'expectedresult=0SELECT COUNT(*)from USER_ERRORS,其中类型='procedure''解析SqlCheck前置条件。 那个前置条件语法有什么问题?

  • 问题内容: 以下是JSX中我的render方法的一部分-为什么在抛出错误后分号为何?在普通的JavaScript中完全可以 问题答案: 这是因为JSX 表达式仅限于单个表达式。 ..将引发错误。 但是,您可以通过使用两个表达式来解决此问题 如果只有一个表达式,则不需要分号。 如果您希望对此有所了解,可以在返回以逗号分隔的最后一个表达式之前,在表达式中使用鲜为人知的逗号运算符进行一些本地工作: 将显

  • 我正在使用python 2.7。win8上的9。当我尝试使用matplotlib绘图时,出现以下错误: 从pylab导入* 绘图([1,2,3,4]) [matplotlib.lines.Line2D对象位于0x0392A9D0] 我尝试了测试代码“python simple_plot.py--verbose help”,出现了以下警告: $HOME=C:\Users\XX matplotlib数

  • 错误:第 1 行的解析错误:函数搜索(sour ^ 期望“字符串”、“数字”、“空”、“真”、“假”、“{”、“[”,得到“未定义” 代码: