我有一系列这样的对象:

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相关问答推荐

获取表格的左滚动位置

如何最好地从TypScript中的enum获取值

当在select中 Select 选项时,我必须禁用不匹配的 Select

在页面上滚动 timeshift 动垂直滚动条

我应该绑定不影响状态的函数吗?'

我可以从React中的出口从主布局调用一个处理程序函数吗?

Rehype将hashtag呈现为URL

如何在模块层面提供服务?

对网格项目进行垂直排序不起作用

检索相加到点的子项

根据一个条件,如何从处理过的数组中移除一项并将其移动到另一个数组?

当标题被点击时,如何使内容出现在另一个div上?

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

未捕获的运行时错误:调度程序为空

如何更改Html元素S的 colored颜色 ,然后将其褪色为原始 colored颜色

我为什么要使用回调而不是等待?

如何在Java脚本中并行运行for或任意循环的每次迭代

如何检测当前是否没有按下键盘上的键?

验证Java脚本函数中的两个变量

单击子按钮时将活动切换类添加到父分区