首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >群和和的ES6实现

群和和的ES6实现
EN

Stack Overflow用户
提问于 2018-03-26 06:04:22
回答 4查看 7.6K关注 0票数 3

我有一个具有以下属性的对象数组: material_no、material_name、qty。

代码语言:javascript
运行
复制
let data = [
  { material_no: '1001', material_name: 'Material 1', qty: 100 },
  { material_no: '1001', material_name: 'Material 1', qty: 50 },
  { material_no: '1002', material_name: 'Material 2', qty: 44 },
  { material_no: '1003', material_name: 'Material 3', qty: 125 },
  { material_no: '1002', material_name: 'Material 2', qty: 59 },
  { material_no: '1004', material_name: 'Material 4', qty: 999 },
  { material_no: '1005', material_name: 'Material 5', qty: 80 },
  { material_no: '1005', material_name: 'Material 5', qty: 66 }
]

如何返回按其material/material和qty的和分组的对象数组,这些对象具有相同的material_no/material_name?

代码语言:javascript
运行
复制
[
  { material_no: '1001', material_name: 'Material 1', qty: 150 },
  { material_no: '1002', material_name: 'Material 2', qty: 103 },
  { material_no: '1003', material_name: 'Material 3', qty: 125 },
  { material_no: '1004', material_name: 'Material 4', qty: 999 },
  { material_no: '1005', material_name: 'Material 5', qty: 146 }
]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-26 06:29:12

可以将数组缩减为Map,该数组通过material_no存储总项。然后将地图值提取到数组中。

代码语言:javascript
运行
复制
let data = [
  { material_no: '1001', material_name: 'Material 1', qty: 100 },
  { material_no: '1001', material_name: 'Material 1', qty: 50 },
  { material_no: '1002', material_name: 'Material 2', qty: 44 },
  { material_no: '1003', material_name: 'Material 3', qty: 125 },
  { material_no: '1002', material_name: 'Material 2', qty: 59 },
  { material_no: '1004', material_name: 'Material 4', qty: 999 },
  { material_no: '1005', material_name: 'Material 5', qty: 80 },
  { material_no: '1005', material_name: 'Material 5', qty: 66 }
]

const sums = [
  ...data.reduce(
    (map, item) => {
      const { material_no: key, qty } = item;
      const prev = map.get(key);
      
      if(prev) {
        prev.qty += qty
      } else {
        map.set(key, Object.assign({}, item))
      }
      
      return map
    },
    new Map()
  ).values()
]

console.log(sums)

票数 5
EN

Stack Overflow用户

发布于 2018-03-26 10:51:42

您可以这样使用.reduce()

代码语言:javascript
运行
复制
let data = [{ material_no: '1001', material_name: 'Material 1', qty: 100 },{ material_no: '1001', material_name: 'Material 1', qty: 50 },{ material_no: '1002', material_name: 'Material 2', qty: 44 },{ material_no: '1003', material_name: 'Material 3', qty: 125 },{ material_no: '1002', material_name: 'Material 2', qty: 59 },{ material_no: '1004', material_name: 'Material 4', qty: 999 },{ material_no: '1005', material_name: 'Material 5', qty: 80 },{ material_no: '1005', material_name: 'Material 5', qty: 66 }];

let result = Object.values(
               data.reduce((a, c) => (
                 a[c.material_no] = a[c.material_no] ?
                 (a[c.material_no].qty += c.qty, a[c.material_no]) :
                 c, a), {}
               )
             );

console.log(result);
代码语言:javascript
运行
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

有用资源:

票数 2
EN

Stack Overflow用户

发布于 2018-03-26 06:51:56

代码语言:javascript
运行
复制
data
    .sort((a, b) => a.material_no - b.material_no)
    .map(({material_no, material_name, qty}, index, arr) => ({
        material_no,
        material_name,
        qty: qty + (material_no === (arr[index - 1] || {}).material_no && arr[index - 1].qty)
    }))
    .filter(({material_no}, index, arr) => material_no !== (arr[index + 1] || {}).material_no);

它很慢,只是为了好玩:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49484910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档