嵌套 for 循环以获得另一个对象数组输出

nested for loops to get another object-array output

我需要根据每个对象的 ID 将“obj1”中的所有“值”与 obj2 中的“百分比”相乘。最好的方法是什么?我试过 for 循环并减少但我没有成功。任何帮助将不胜感激。

const obj1 = [ { id: 1, value: 10 }, { id: 2, value: 10 } ]

const obj2 = {
  len: {
      id: 1,
      nj: "321345", 
      percent: 0.05,
  },
  wor: {
      id: 2,
      nj: "321345", 
      percent: 0.1,
  }
}

outputExpected: [ { id: 1, value: 0.5 }, { id: 2, value: 1 } ]

这应该对您有用,但如果 id 在两个对象中都不存在,则不会处理异常。

// First get the values in an array for easier manipulation
const aux = Object.values(obj2)

const output = obj1.map(ob => {
  // Find the id in the other array.
  const obj2Ob = aux.find(o => o.id === ob.id) // The id must exist in this aproach
  
  return {
    id: ob.id,
    value: ob.value * obj2Ob.percent
  }
})

console.log(output) // [ { id: 1, value: 0.5 }, { id: 2, value: 1 } ]

您可以通过检查并匹配 ID 来做到这一点。但是,如果对它们进行排序,则可以进行一些优化。

const obj1 = [ { id: 1, value: 10 }, { id: 2, value: 10 } ]

const obj2 = {
  len: {
      id: 1,
      nj: "321345", 
      percent: 0.05,
  },
  wor: {
      id: 2,
      nj: "321345", 
      percent: 0.1,
  }
}
const x = Object.keys(obj2).map((key,index)=>{
  const { id, value } = obj1.find(({id})=>id===obj2[key].id)
  return ({id,value:value*obj2[key].percent})
})
console.log(x)
//outputExpected: [ { id: 1, value: 0.5 }, { id: 2, value: 1 } ]

您可以先使用 Map, then loop over the obj1 using map 创建一个查找映射以获得所需的结果

const obj1 = [
  { id: 1, value: 10 },
  { id: 2, value: 10 },
];

const obj2 = {
  len: {
    id: 1,
    nj: "321345",
    percent: 0.05,
  },
  wor: {
    id: 2,
    nj: "321345",
    percent: 0.1,
  },
};

const map = new Map();
Object.values(obj2).forEach((v) => map.set(v.id, v));

const result = obj1.map((o) => ({ ...o, value: o.value * map.get(o.id).percent }));

console.log(result);