我有一系列这样的对象:

const arr = [
  {"id" : 1, "name" : "john", "age": 12, "fruits": "banana"},
  {"id" : 2, "name" : "john", "age": 12, "fruits": "apple"}
  {"id" : 3, "name" : "maria", "age": 13, "fruits": "grappes"}
  {"id" : 4, "name" : "maria", "age": 13, "fruits": "blackberry"}
  {"id" : 5, "name" : "camille", "age": 12, "fruits": "cherry"}
]

我希望每个人(名字)都有一个对象,并添加他们的对象.

因此,最终的数组将是:

const arr = [
  {"id" : 1, "name" : "john", "age": 12, "fruits": ["banana", "apple"]},
  {"id" : 3, "name" : "maria", "age": 13, "fruits": ["grappes", "blackberry"]}
  {"id" : 5, "name" : "camille", "age": 12, "fruits": ["cherry"]}
];

我使用的真正数组非常大,这就是为什么我在寻找最有效的方法.

推荐答案

可以使用Array.prototype.reduce对对象进行分组.

const arr = [
  { id: 1, name: "john", age: 12, fruits: "banana" },
  { id: 2, name: "john", age: 12, fruits: "apple" },
  { id: 3, name: "maria", age: 13, fruits: "grappes" },
  { id: 4, name: "maria", age: 13, fruits: "blackberry" },
  { id: 5, name: "camille", age: 12, fruits: "cherry" },
];

const output = Object.values(
  arr.reduce((res, o) => {
    if (!res[o.name]) {
      res[o.name] = { ...o, fruits: [] };
    }
    res[o.name].fruits.push(o.fruits);
    return res;
  }, {})
);

console.log(output);

Javascript相关问答推荐

不完整的谢尔宾斯基三角形展示

如何有条件地在 Angular Reactive Form 中设置 [disabled] 属性值?

在样式化组件中使用动画

模板文字类型等效

相对定位的

防止绝对定位的元素在没有明显重叠的情况下显示

使用异步函数和promise 处理递归的最佳方法?

单击菜单容器外时如何防止页面滚动和关闭菜单

对数组中的所有数字求和,直到达到某个值

数组更改后动态按钮类不更新

过滤递归数组

删除有条件的重复对象

不适用于 React 的 JSX 条件

在提交表单之前询问用户

AWS-Amplify,我如何在 Angular 登录后重定向到另一个 URL?

我如何在这个动画 blob 中移动与“blob”的“交互”?

ObjectSpaceNormalMap 不适用于 MeshNormalMaterial

在数据表中进行过滤时更新总和

在 Javascript 中shuffle 嵌套数组

EcmaScript 规范中 classScope 的目的是什么?

Typescript 自动生成的 JS 文件:“Uncaught TypeError: Failed to resolve module specifier”