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

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

在js中聚合數組內的對象

在js中聚合數組內的對象

HUX布斯 2024-01-18 16:53:02
我有一個如下所示的數組:[  {"sku": 123, "val": 10}, {"sku": 124, "val":12}, {"sku": 123, "val": 20}]javascript 中是否有一種快速方法可以對val具有相同 sku 屬性的對象求和,因此結果將是:[  {"sku": 123, "val": 30}, {"sku": 124, "val":12}]
查看完整描述

4 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

您可以使用javascript的reduce函數

const array = [?

?{ "sku": 123, "val": 10 },

?{ "sku": 124, "val": 12 },

?{ "sku": 123, "val": 20 }

];


const result = [];


array.reduce((res, value) => {

? if (!res[value.sku]) {

? ? res[value.sku] = { "sku": value.sku, "val": 0 };

? ? result.push(res[value.sku])

? }

? res[value.sku].val += value.val;

? return res;

}, {});


console.log(result)


查看完整回答
反對 回復 2024-01-18
?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

您應該按 SKU 對條目進行分組,然后將條目映射到 SKU 和減少的值(總和)。


const data = [ 

 { "sku": 123, "val": 10 },

 { "sku": 124, "val": 12 },

 { "sku": 123, "val": 20 }

];


const groupBy = (arr, key) => arr.reduce((acc, entry) => ({

  ...acc, [entry[key]]: [ ...(acc[entry[key]] || []), entry ]

}), {}); 


const sum = Object.entries(groupBy(data, 'sku'))

  .map(([key, values]) =>

    ({

      'sku': key,

      'val': values.reduce((acc, { val }) => acc + val, 0)

    }))


console.log(sum);

.as-console-wrapper { top: 0; max-height: 100% !important; }

這是一個更加動態的版本,允許使用具有各種聚合技術的多個減速器。


const groupBy = (arr, key) => arr.reduce((acc, entry) => ({

  ...acc, [entry[key]]: [ ...(acc[entry[key]] || []), entry ]

}), {}); 


const aggregate = (arr, key, reducers) =>

  Object.entries(groupBy(arr, key))

    .map(([k1, values]) => Object.entries(reducers)

      .reduce((obj, [k2, { fn, initial }]) => ({

        ...obj,

        [k2]: values.reduce((acc, item, index, all) =>

          fn(acc, item[k2], index, all), initial || 0)

      }), { [key]: k1 }))


const data = [ 

 { "sku": 123, "val": 10, "val2": 2 },

 { "sku": 124, "val": 12, "val2": 5  },

 { "sku": 123, "val": 20, "val2": 8  }

];


const aggregated = aggregate(data, 'sku', {

  'val'  : { fn: (acc, val) => acc + val, initial: 0 },

  'val2' : { fn: (acc, val) => acc * val, initial: 1 }

});


console.log(aggregated);

.as-console-wrapper { top: 0; max-height: 100% !important; }


查看完整回答
反對 回復 2024-01-18
?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

跟蹤對象中的總和:


const arr = [ 

    {"sku": 123, "val": 10},

    {"sku": 124, "val":12},

    {"sku": 123, "val": 20}

];


const sums = {};

for (const {sku, val} of arr) {

    if (!(sku in sums)) {

        sums[sku] = 0;

    }

    sums[sku] += val;

}


const result = Object.entries(sums).map(([k, v]) => ({sku: k, val: v}));

console.log(result);


查看完整回答
反對 回復 2024-01-18
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

用于forEach構建一個帶有鍵sku和值進行聚合的對象。從上面的對象中

獲取。Object.values


const group = (arr) => {

  const res = {};

  arr.forEach(({sku, val}) => {

    res[sku] ? (res[sku].val += val) : res[sku] = { sku, val };

  });

  return Object.values(res);

};


const arr = [

  { sku: 123, val: 10 },

  { sku: 124, val: 12 },

  { sku: 123, val: 20 },

];


console.log(group(arr));


查看完整回答
反對 回復 2024-01-18
  • 4 回答
  • 0 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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