提问者:小点点

基于对象中键的比较计算和


我有下面的对象数组,其中存储了计划编号

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?


共1个答案

匿名用户

如果首先构建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);