【问题标题】:Merging nested array in JavaScript with id将 JavaScript 中的嵌套数组与 id 合并
【发布时间】:2022-12-09 18:55:32
【问题描述】:

我是 JavaScript 初学者。我想将嵌套数组与“id”合并 <-- 对于所有对象数组都是唯一的。虚拟只是一个额外的数据,应该与 id 一起出现


let arr1 = [
  {
    A: 0.71,
    B: 0.52,
    id: 1,
    dummy: 1,
  },
  {
    A: 0.72,
    B: 0.50,
    id: 2,
    dummy: 1,
  },
];

let arr2 = [
  {
    A: 0.157,
    B: 0.02255,
    id: 1,
    dummy: 1,
  },
  {
    A: 0.16761,
    B: 0.028281,
    id: 2,
    dummy: 1,
  },
];

let arr3 = [
  {
    A: 0.55,
    B: 0.50,
    id: 1,
    dummy: 1,
  },
  {
    A: 0.5,
    B: 0.43,
    id: 2,
    dummy: 1,
  },
];

我希望这些在一个数组中作为包含 id 的 finalArray 以及包含各自 id 的所有三个数组

let finalArr = [
  {
    id: 1,
    dummy: 1,
    arr1_A: 0.71,
    arr1_B: 0.52,
    arr2_A: 0.157,
    arr2_B: 0.02255,
    arr3_A: 0.55,
    arr3_B: 0.5,
  },
  {
    id: 2,
    dummy: 1,
    arr1_A: 0.72,
    arr1_B: 0.5,
    arr2_A: 0.16761,
    arr2_B: 0.028281,
    arr3_A: 0.5,
    arr3_B: 0.43,
  },
];

【问题讨论】:

  • 如果相同 id 的 dummy 值不同怎么办?
  • 虚拟值可以是任何整数。
  • 如何命名 finalArr 中的数组? arr后面跟一个连续的数字?
  • 如果虚拟可以是任何整数而不是你想要的输出不能为每个 id 保存多个虚拟值
  • 每个 id,只有一个虚拟值。 (例如 id:1 dummy:7 现在这对于具有 id: 1 的所有三个数组都是相同的)

标签: javascript arrays


【解决方案1】:

您可以先使用 .reduce() 通过 id 收集数据,然后将数据转换为所需的数组格式:

let arr1 = [
  { A: 0.71, B: 0.52, id: 1, dummy: 1, },
  { A: 0.72, B: 0.50, id: 2, dummy: 1, },
];
let arr2 = [
  { A: 0.157,   B: 0.02255,  id: 1, dummy: 1, },
  { A: 0.16761, B: 0.028281, id: 2, dummy: 1, },
];
let arr3 = [
  { A: 0.55, B: 0.50, id: 1, dummy: 1, },
  { A: 0.5,  B: 0.43, id: 2, dummy: 1, },
];

let idMap = arr1.concat(arr2).concat(arr3).reduce((acc, obj) => {
  if(!acc[obj.id]) {
    acc[obj.id] = {
      dummy: obj.dummy,
      arrs: []
    }
  }
  acc[obj.id].arrs.push({ A: obj.A, B: obj.B });
  return acc;
}, {});
let finalArr = Object.keys(idMap).map(id => {
  let obj = {
    id: id,
    dummy: idMap[id].dummy
  };
  let idx = 1;
  idMap[id].arrs.forEach(o => {
    obj['arr' + idx++] = o;
  });
  return obj;
});
console.log(finalArr);

【讨论】:

    【解决方案2】:

    同样的解决方案不地图减少旧浏览器的方法

    let arr1 = [
      { A: 0.71, B: 0.52, id: 1, dummy: 1, },
      { A: 0.72, B: 0.50, id: 2, dummy: 1, },
    ];
    let arr2 = [
      { A: 0.157,   B: 0.02255,  id: 1, dummy: 1, },
      { A: 0.16761, B: 0.028281, id: 2, dummy: 1, },
    ];
    let arr3 = [
      { A: 0.55, B: 0.50, id: 1, dummy: 1, },
      { A: 0.5,  B: 0.43, id: 2, dummy: 1, },
    ];
    
    let finalArr = []
    let keysToUse = ['id', 'dummy'];
    let countOfIds = arr1.length;
    let ids = arr1.map(d => d.id);
    let varArrayToUse = ['arr1', 'arr2', 'arr3'];
    // console.log('len '+countOfIds)
    
    for(var i = 0; i < ids.length; i++){
        finalArr[i] = {
            id: arr1[i].id,
            dummy: arr1[i].dummy,
        }
    
        for(var j = 0; j < varArrayToUse.length; j++) {
            if (j == 0) { targetArr = arr1 } else if (j == 1) {targetArr = arr2} else {targetArr = arr3}
            finalArr[i][varArrayToUse[j]] =  
                {
                    A: (targetArr[i]).A,
                    B: (targetArr[i]).B
                }                
        }
    }
    console.log(finalArr)
    

    【讨论】:

      猜你喜欢
      • 2019-07-20
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多