我有下面的对象数组,其中存储了计划编号
const initialObj = [
{
index: 9417,
schudule_number: '11010'
},
{
index: 8427,
schudule_number: '11020'
}
];
这是我需要的预期输出:
const finalOutput = [
{
index: 9417,
schudule_number: '11010',
adjustedAmount: [ {key:"Labour Cost",value:11},{key:"Material Cost",value:0} ]
},
{
index: 8427,
schudule_number: '11020',
adjustedAmount: [ {key:"Labour Cost",value:6},{key:"Material Cost",value:2} ]
}
];
下面是对象的adjustedAmount数组,我使用它来计算每个值的和:
const amount = [{
adjustedAmount: '[{"key":"Labour Cost","value":1},{"key":"Material Cost","value":0}]',
schudule_number: '11010'
},
{
adjustedAmount: '[{"key":"Labour Cost","value":10},{"key":"Material Cost","value":0}]',
schudule_number: '11010'
},
{
adjustedAmount: '[{"key":"Labour Cost","value":1},{"key":"Material Cost","value":0}]',
schudule_number: '11020'
},
{
adjustedAmount: '[{"key":"Labour Cost","value":5},{"key":"Material Cost","value":2}]',
schudule_number: '11020'
}
];
用于计算每个值之和的代码,但它不比较计划编号
const sumResults =
Object.entries(amount)
.map(x => JSON.parse(x.adjustedAmount))
.flatMap(x => [...x])
.reduce((acc, curr) => {
if (acc[curr.key]) {
acc[curr.key] += curr.value;
} else {
acc[curr.key] = curr.value;
}
return acc;
}, {}))
.map(([key, value]) => ({
key,
value
}));
最后合并对象数组
initialObj.forEach(va => {
va["adjustedAmount"] = sumResults;
});
我如何比较计划编号并插入initialObj?
如果首先构建amount
数据的简单映射:
const amountMap = amount.reduce((acc, a) => {
const item = acc[a.schudule_number];
const obj = JSON.parse(a.adjustedAmount).reduce( (obj,i) => ({...obj, [i.key]:i.value}),{});
if(item){
Object.entries(obj).forEach( ([k,v]) => item[k] += v);
}
else{
acc[a.schudule_number] = obj;
}
return acc;
},{});
那么将其引入finaloutput
的代码非常简单:
const finalOutput = initialObj.map(o => ({
...o,
adjustedAmount: Object.entries(amountMap[o.schudule_number]).map( ([k,v]) => ({key:k,value:v}))
}))
以下实时示例:
null
const initialObj = [
{
index: 9417,
schudule_number: '11010'
},
{
index: 8427,
schudule_number: '11020'
}
];
const amount = [{
adjustedAmount: '[{"key":"Labour Cost","value":1},{"key":"Material Cost","value":0}]',
schudule_number: '11010'
},
{
adjustedAmount: '[{"key":"Labour Cost","value":10},{"key":"Material Cost","value":0}]',
schudule_number: '11010'
},
{
adjustedAmount: '[{"key":"Labour Cost","value":1},{"key":"Material Cost","value":0}]',
schudule_number: '11020'
},
{
adjustedAmount: '[{"key":"Labour Cost","value":5},{"key":"Material Cost","value":2}]',
schudule_number: '11020'
}
]
const amountMap = amount.reduce((acc, a) => {
const item = acc[a.schudule_number];
const obj = JSON.parse(a.adjustedAmount).reduce( (obj,i) => ({...obj, [i.key]:i.value}),{});
if(item){
Object.entries(obj).forEach( ([k,v]) => item[k] += v);
}
else{
acc[a.schudule_number] = obj;
}
return acc;
},{});
const finalOutput = initialObj.map(o => ({
...o,
adjustedAmount: Object.entries(amountMap[o.schudule_number]).map( ([k,v]) => ({key:k,value:v}))
}))
console.log(finalOutput);