首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合在数组内部推送的项

组合在数组内部推送的项
EN

Stack Overflow用户
提问于 2018-03-20 08:15:09
回答 2查看 48关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
let result = Object.values(response.data.reduce((r,{ PO_NO, PO_LINE_NO, MATERIAL_NO, MATERIAL_NAME, PO_QTY, GRPO_QTY, GRPO_SHIPDATE }) => {
    r[PO_NO] = r[PO_NO] || { PO_NO, LINES: [] }
    r[PO_NO].LINES.push({ 
        LINE_NO: PO_LINE_NO, 
        PO_QTY: PO_QTY, 
        MATERIAL_NO: MATERIAL_NO, 
        MATERIAL_NAME: MATERIAL_NAME, 
        GRPO_QTY: GRPO_QTY, 
        GRPO_SHIPDATE: GRPO_SHIPDATE 
    })
    return r
},{}))

结果是嵌套对象的数组。但是,在LINES.push()部分中,有一些项具有相同的line_no、material_no、material_name和po_qty。不同的是grpo_qty和grpo_shipdate。

是否可以删除发货日期,并为每个grpo_qty获取具有相同line_no的po_no之和,从而使每个po_no的每个line_no只有一行?

response.data内容示例:

代码语言:javascript
复制
  {
    "PO_NO": 35159,
    "LINES": [
      {
        "LINE_NO": 15,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 160000,
        "GRPO_SHIPDATE": "September, 21 2017 00:00:00"
      },
      {
        "LINE_NO": 15,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 320800,
        "GRPO_SHIPDATE": "October, 07 2017 00:00:00"
      },
      {
        "LINE_NO": 15,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 19200,
        "GRPO_SHIPDATE": "October, 20 2017 00:00:00"
      },
      {
        "LINE_NO": 16,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 60000,
        "GRPO_SHIPDATE": "September, 13 2017 00:00:00"
      },
      {
        "LINE_NO": 16,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 440000,
        "GRPO_SHIPDATE": "October, 20 2017 00:00:00"
      }
    ]
  },
EN

回答 2

Stack Overflow用户

发布于 2018-03-20 08:53:51

嗯,我认为您可以对每个条目进行迭代,并在行数组上调用一个约简函数。在这个函数中,您可以创建一个唯一的键,其属性保持不变,然后对grpo_qty值进行汇总。

它可能看起来像这样

代码语言:javascript
复制
result.forEach(entry => {
    entry.LINES = Object.values(entry.LINES.reduce((result, current) => {
        const uniqueKey = `${current.LINE_NO}-${current.MATERIAL_NO}-${current.PO_QTY}-${current.MATERIAL_NAME}`;
        if (!result[uniqueKey]) {
            result[uniqueKey] = {
                LINE_NO: current.LINE_NO,
                PO_QTY: current.PO_QTY,
                MATERIAL_NO: current.MATERIAL_NO,
                MATERIAL_NAME: current.MATERIAL_NAME,
                GRPO_QTY: 0,
            };
        }
        result[uniqueKey].GRPO_QTY += current.GRPO_QTY;

        return result;
    }, {}));
});

也许你可以提供一个小提琴,所以它更容易测试。

您也可以想象在原来的减缩中这样做。在那里创建唯一的键,并对值进行总结。然后,稍后只需将对象转换回数组即可。

从理论上讲,也可以直接在数组中编写所有内容,并使用array.find()找到现有的条目,但就我个人而言,我建议使用一种reduce。它更干净,更有表现力,更容易阅读。

票数 0
EN

Stack Overflow用户

发布于 2018-03-20 08:59:43

我会对数组进行迭代,并对数量进行求和:

代码语言:javascript
复制
const newLines = [],
    lineNumbers = [];
lines.forEach(line => {
    delete line.GRPO_SHIPDATE; /* delete shipdate */
    if (!lineNumbers.includes(line.LINE_NO)) {
        lineNumbers.push(line.LINE_NO); /* store current LINE_NO */
        newLines.push(line);
    } else {
        let toChange = newLines.filter(ln => { /* get current LINE_NO */
            return ln.LINE_NO === line.LINE_NO
        });
        toChange[0].GRPO_QTY = toChange[0].GRPO_QTY + line.GRPO_QTY;
    }
});

代码语言:javascript
复制
const lines = [{
        "LINE_NO": 15,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 160000,
        "GRPO_SHIPDATE": "September, 21 2017 00:00:00"
    },
    {
        "LINE_NO": 15,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 320800,
        "GRPO_SHIPDATE": "October, 07 2017 00:00:00"
    },
    {
        "LINE_NO": 15,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 19200,
        "GRPO_SHIPDATE": "October, 20 2017 00:00:00"
    },
    {
        "LINE_NO": 16,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 60000,
        "GRPO_SHIPDATE": "September, 13 2017 00:00:00"
    },
    {
        "LINE_NO": 16,
        "PO_QTY": 500000,
        "MATERIAL_NO": "130227",
        "MATERIAL_NAME": "T3-0381 Base Mold  φ10 M2",
        "GRPO_QTY": 440000,
        "GRPO_SHIPDATE": "October, 20 2017 00:00:00"
    }
]
const newLines = [],
    lineNumbers = [];
lines.forEach(line => {
    delete line.GRPO_SHIPDATE; /* delete shipdate */
    if (!lineNumbers.includes(line.LINE_NO)) {
        lineNumbers.push(line.LINE_NO); /* store current LINE_NO */
        newLines.push(line);
    } else {
        let toChange = newLines.filter(ln => { /* get current LINE_NO */
            return ln.LINE_NO === line.LINE_NO
        });
        toChange[0].GRPO_QTY = toChange[0].GRPO_QTY + line.GRPO_QTY;
    }
});

console.log(newLines)

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

https://stackoverflow.com/questions/49379225

复制
相关文章

相似问题

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