亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據特定字段對對象數組進行分組

根據特定字段對對象數組進行分組

慕桂英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條經驗 獲得超16個贊

就像您提到的那樣,我們可以使用對象而不是數組作為最外層的包裝器。并且還將一個對象內部交換為數組,那么這是一種可能的解決方案。


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 關注
  • 218 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號