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

基本上我有这个 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

      }

    ]

  }

];

谢谢你!


凤凰求蛊
浏览 96回答 2
2回答

富国沪深

您可以使用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);

喵喵时光机

一种方法是使用 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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript