Javascript 组合阵列内推送的物品减少
我有以下代码:Javascript 组合阵列内推送的物品减少,javascript,ecmascript-6,Javascript,Ecmascript 6,我有以下代码: 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
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部件中,有些项目具有相同的行号、物料号、物料名称和采购订单数量。差异是grpo_数量和grpo_发货日期
是否可以删除发货日期并获得每个采购订单号的同一行的grpo\U数量之和,以便我在每个采购订单号的每一行只有一行
响应数据内容示例:
{
"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"
}
]
},
我认为您可以迭代每个条目,并在lines数组上调用reduce函数。在该函数中,您可以创建一个属性保持不变的唯一键,然后汇总grpo_数量值 它可能看起来像这样
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;
}, {}));
});
也许您可以提供一个JSFIDLE,以便更容易测试
你也可以想象在你最初的reduce中这样做。在此处创建唯一键,并汇总值。然后,您以后只需要将对象转换回数组
从理论上讲,也可以直接在数组中写入所有内容,并使用array.find查找现有条目,但我个人建议使用一个reduce。编写函数matchLine和combineLine帮助我们将GroupPoline分解为一个更简单的任务-注意,这里的每个函数都不会改变其输入
const matchLine = (a, b) =>
a.LINE_NO === b.LINE_NO
&& a.PO_QTY === b.PO_QTY
&& a.MATERIAL_NO === b.MATERIAL_NO
const combineLine = ({ GRPO_SHIPDATE:_, ...a }, b) =>
({ ...a, GRPO_QTY: a.GRPO_QTY + b.GRPO_QTY })
const groupPoLines = ({ LINES, ...po }) => ({
...po,
LINES: LINES.reduce ((r, x) => {
const i = r.findIndex (y => matchLine (x, y))
if (i < 0)
return [ ...r, x ]
else
return Object.assign (r, { [i]: combineLine (r[i], x) })
}, [])
})
console.log (groupPoLines (data))
// { PO_NO: 35159,
// LINES:
// [ { LINE_NO: 15,
// PO_QTY: 500000,
// MATERIAL_NO: '130227',
// MATERIAL_NAME: 'T3-0381 Base Mold φ10 M2',
// GRPO_QTY: 500000 },
// { LINE_NO: 16,
// PO_QTY: 500000,
// MATERIAL_NO: '130227',
// MATERIAL_NAME: 'T3-0381 Base Mold φ10 M2',
// GRPO_QTY: 500000 } ] }
展开代码段以验证其是否有效
常数数据={
邮政编码:35159,,
线路:[
{
第15行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
总采购订单数量:160000,
GRPO_发货日期:2017年9月21日00:00:00
},
{
第15行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
总采购订单数量:320800,
GRPO_发货日期:2017年10月7日00:00:00
},
{
第15行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
GRPO_数量:19200,
GRPO_发货日期:2017年10月20日00:00:00
},
{
第16行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
GRPO_数量:60000,
GRPO_发货日期:2017年9月13日00:00:00
},
{
第16行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
总采购订单数量:440000,
GRPO_发货日期:2017年10月20日00:00:00
}
]
}
常数匹配线=a,b=>
a、 行号===b.行号
&&a.采购订单数量===b.采购订单数量
&&a.材料编号===b.材料编号
const combineLine={GRPO_SHIPDATE:,…a},b=>
{…a,GRPO_数量:a.GRPO_数量+b.GRPO_数量}
const groupPoLines={LINES,…po}=>{
……阿宝,
行:LINES.reducer,x=>{
常数i=r.findIndex y=>匹配线x,y
如果i<0
返回[…r,x]
其他的
返回Object.assign r,{[i]:组合线r[i],x}
}, []
}
console.log groupPoLines数据
console.log'--'
console.log[data,data,data].mapd=>groupPoLines d我将迭代数组并对数量求和:
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;
}
});
常量行=[{
第15行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
总采购订单数量:160000,
GRPO_发货日期:2017年9月21日00:00:00
},
{
第15行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
总采购订单数量:320800,
GRPO_发货日期:2017年10月7日00:00:00
},
{
第15行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
GRPO_数量:19200,
GRPO_发货日期:2017年10月20日00:00:00
},
{
第16行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
GRPO_数量:60000,
GRPO_发货日期:2017年9月13日00:00:00
},
{
第16行,
采购订单数量:500000,
材料编号:130227,
材料名称:T3-0381底模φ10m2,
总采购订单数量:440000,
GRPO_发货日期:2017年10月20日00:00:00
}
]
常量换行符=[],
行号=[];
lines.forEachline=>{
删除line.GRPO_SHIPDATE;/*删除SHIPDATE*/
如果!LineNumber.IncludeLine.LINE\u NO{
linenumber.pushline.LINE\u NO;/*存储当前行\u NO*/
换行。推行;
}否则{
让toChange=newLines.filternn=>{/*获取当前行\u编号*/
返回ln.LINE\u编号===LINE.LINE\u编号
};
toChange[0]。GRPO\U数量=toChange[0]。GRPO\U数量+行。GRPO\U数量;
}
};
console.lognewlines当您使用ES6时,您可以使用简化当前代码。按{LINE_NO:PO_LINE_NO,PO_数量,MATERIAL_NO,MATERIAL_NAME,GRPO_数量,GRPO_SHIPDATE}天哪,您太棒了!
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;
}
});