当前位置: 首页 > 知识库问答 >
问题:

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

谷梁涵忍
2023-03-14

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

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个答案

张伯寅
2023-03-14

如果首先构建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);
 类似资料:
  • 问题内容: 我希望能够使LinkedList.contains()对于自定义比较器返回true。 假设我有1个LinkedList和2个对象 从技术上讲,两个对象在比较方面是相同的(MyObject实现Comparable) (a == b)==真 但是,当我执行以下操作时,myList对于myList.contains(b)不会返回true 我认为它是因为contains将检查对象引用,并看到a

  • 问题内容: 在JavaScript中比较对象的最佳方法是什么? 例: 我知道如果 两个对象引用的是完全相同的对象 , 则它们相等 ,但是有没有办法检查它们是否具有相同的属性值? 以下方法对我有用,但这是唯一的可能性吗? 问题答案: 不幸的是,除非您递归使用并访问所有不可枚举的属性,否则没有完美的方法,但这仅在Firefox中有效。 因此,我能做的最好是猜测使用情况。 1)快速且有限。 当您具有简单

  • 问题内容: 可以对Angular中的两个对象进行“深度”比较吗?我想做的是比较每个键/值对。例如: 对象1 对象2 我需要的是比较失败,因为只有一对键/值对是不同的。换句话说,所有键/值对必须完全匹配,否则将失败。这是Angular中已经内置的东西吗?我确信如果确实需要,我可以编写自己的服务,但我希望它已经内置。类似于angular.equals。 问题答案: 要比较两个对象,可以使用: 它进行了

  • 本文向大家介绍基于java中cookie和session的比较,包括了基于java中cookie和session的比较的使用技巧和注意事项,需要的朋友参考一下 cookie和session的比较 一、对于cookie: ①cookie是创建于服务器端 ②cookie保存在浏览器端 ③cookie的生命周期可以通过cookie.setMaxAge(2000);来设置,如果没有设置setMaxAge,

  • 问题内容: 我得到的错误就在这行 。 该怎么办?其他逻辑还可以吗? 我想做的是有一个A列表和一个B列表,其中一个属性与id相同;尽管变量名不同。即在和在B。现在我将两个列表都放在ListAll中,并在相同的变量id / bid上对它们进行排序。我有A和B实现可比性。 和我的listAll是对象类型? 我该怎么做?谢谢。 问题答案: 您可以添加一个通用基类并在那里进行比较,如下所示:

  • 我正在尝试创建一个二进制搜索程序,该程序可以使用各种类型的变量(int、float、string等)来查看数组中是否存在元素。我正试图找出如何比较变量。下面是我正在使用的内容的草图: 我甚至不确定使用对象是否是最好的方法。