为了账号安全,请及时绑定邮箱和手机立即绑定

将重复的对象属性移动到对象数组中的单个属性中

将重复的对象属性移动到对象数组中的单个属性中

凤凰求蛊 2023-02-17 10:54:12
基本上我有这个 JavaScript 数组:const a = [  {name: 'Foo', place: 'US', age: 15},  {name: 'Foo', place: 'UK', age: 21},  {name: 'Bar', place: 'Canada', age: 20},  {name: 'Bar', place: 'China', age: 22}];让它看起来像这样的最快方法是什么?(其中名称成为“a”数组中的单个对象属性)。我将如何遍历数组?const a = [  {    name: 'Foo',    data: [      {        place: 'US', age: 15      },      {        place: 'UK', age: 21      }    ]  },  {    name: 'Bar',    data: [      {        place: 'Canada', age: 20      },      {        place: 'China', age: 22      }    ]  }];谢谢你!
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

您可以使用reduce函数根据name属性对数据进行分组,然后取Object.values.


var a = [

  {name: 'Foo', place: 'US', age: 15},

  {name: 'Foo', place: 'UK', age: 21},

  {name: 'Bar', place: 'Canada', age: 20},

  {name: 'Bar', place: 'China', age: 22}

];


var result = Object.values(a.reduce((acc, {name, ...rest})=>{

    acc[name] = acc[name] || {name, data:[]};

    acc[name].data = [...acc[name].data, rest];

    return acc;

},{}));


console.log(result);


查看完整回答
反对 回复 2023-02-17
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

一种方法是使用 ES6 Map。您可以使用.reduce()将对象累积到a地图中。每个都name可以是映射中的键,映射中的每个值都是一个对象数组,该对象的键为name. 一旦构建了Map,就可以使用Array.from()将 Map 转换为数组,同时还提供映射函数,[name, data[]]在 Map 到数组转换发生时将条目转换为对象。

请参见下面的示例:

const a = [

  {name: 'Foo', place: 'US', age: 15},

  {name: 'Foo', place: 'UK', age: 21},

  {name: 'Bar', place: 'Canada', age: 20},

  {name: 'Bar', place: 'China', age: 22}

];


const res = Array.from(a.reduce((m, {name, ...r}) => {

  return m.set(name, (m.get(name) || []).concat(r));

}, new Map), ([name, data]) => ({name, data}));


console.log(res);


查看完整回答
反对 回复 2023-02-17
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信