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

根据特定字段对对象数组进行分组

根据特定字段对对象数组进行分组

慕桂英3389331 2023-09-14 22:02:35
我有一系列对象。我想按特定领域对它们进行分组。[    {        "name": "JOHN",        "type": 1,        "sum": 5    },    {        "name": "SERA",        "type": 1,        "sum": 43    },    {        "name": "SERA",        "type": 2,        "sum": 129    },    {        "name": "JOHN",        "type": 2,        "sum": 200    }]我期望按名称属性分组的输出如下。{    // Group #1    "JOHN": [      {        "type": 2,        "sum": 200      }      {        "type": 1,        "sum": 5      }    ],    // Group #2    "SERA":[     {        "type": 1,        "sum": 43     },     {        "type": 2,        "sum": 129     },    ]}我使用了嵌套循环,但不幸的是执行速度很慢并且没有给出正确的结果。
查看完整描述

4 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

就像您提到的那样,我们可以使用对象而不是数组作为最外层的包装器。并且还将一个对象内部交换为数组,那么这是一种可能的解决方案。


var data = [{"name": "JOHN","type": 1,"sum": 5},{"name": "SERA","type": 1,"sum": 43},{"name": "SERA","type": 2,"sum": 129},{"name": "JOHN","type": 2,"sum": 200}];


var newData = {};


data.forEach( (item) => {


  if (!(item['name'] in newData)) {

      newData[item['name']] = [];

  }

  newData[item['name']].push(

      {

        'type':  item['type'],

        'sum' : item['sum']

      }

  );

});


console.log(newData);


查看完整回答
反对 回复 2023-09-14
?
心有法竹

TA贡献1866条经验 获得超5个赞

您建议的输出结构无效,但是使用Array.reduce您可以创建一个对象,其中所有属性都是对象数组:


const data = [

    {

        "name": "JOHN",

        "type": 1,

        "sum": 5

    },

    {

        "name": "SERA",

        "type": 1,

        "sum": 43

    },

    {

        "name": "SERA",

        "type": 2,

        "sum": 129

    },

    {

        "name": "JOHN",

        "type": 2,

        "sum": 200

    }

];


const result = data.reduce((c, {name, type, sum}) => {

  c[name] = c[name] || [];

  c[name].push({type, sum});

  return c;

}, {});

console.log(result);


查看完整回答
反对 回复 2023-09-14
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

forEach使用,destructuring和??运算符的另一种方式


const merge = (arr) => {

  const obj = {};

  arr.forEach(({ name, ...rest }) => (obj[name] ??= []).push(rest));

  return obj;

};


const data = [

  {

    name: "JOHN",

    type: 1,

    sum: 5,

  },

  {

    name: "SERA",

    type: 1,

    sum: 43,

  },

  {

    name: "SERA",

    type: 2,

    sum: 129,

  },

  {

    name: "JOHN",

    type: 2,

    sum: 200,

  },

];


console.log(merge(data));


查看完整回答
反对 回复 2023-09-14
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您可以使用此函数将 Array.prototype.reduce初始数据转换为另一种数组结构。


let data = [

    {

        "name": "JOHN",

        "type": 1,

        "sum": 5

    },

    {

        "name": "SERA",

        "type": 1,

        "sum": 43

    },

    {

        "name": "SERA",

        "type": 2,

        "sum": 129

    },

    {

        "name": "JOHN",

        "type": 2,

        "sum": 200

    }

];


function groupedBy(data, field) {

  let fieldValues = [...data].reduce((acc, current) => {

    return acc.concat(current[field]);

  }, []).filter((value, index, self) => {

    return self.indexOf(value) === index;

  });

  

  let results = fieldValues.reduce((acc, item) => {

    let items = [...data].filter(el => {

      return el.name === item;

    });

    

    items.forEach(i => delete i.name);

    

    return Object.assign(acc, { [item]: items});

  }, {});

 

  return results;

}


console.log(groupedBy(data, "name"));


查看完整回答
反对 回复 2023-09-14
  • 4 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

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