【问题标题】:I have 2 arrays, how to merge them with the same length but different indexes我有 2 个数组,如何将它们合并为相同长度但不同的索引
【发布时间】:2021-08-24 07:05:01
【问题描述】:

我在一个对象数组中有 2 个数组,它们的长度相同,如何合并它们,值应该被替换(数组有空值)。

对象

obj=[ [
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      "YES",
      null,
      null,
      null,
      null,
      null,
      null,
      null
    ],[
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      "YES",
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null
    ]]

在上面的代码中,array1 在第 23 个索引处具有值,array2 在第 22 个索引处具有值,并且两个数组中的其余值都为空,并且两个数组具有相同的长度。所以我需要一个长度相同的数组,在第 22 和第 23 索引中我需要各自的值,其余值应该为空。 输出(结果)数组应该类似于下面的数组。

结果

result= [
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      "YES",
      "YES",
      null,
      null,
      null,
      null,
      null,
      null,
      null
    ]

【问题讨论】:

  • 你可以做一个简单的null检查并使用for loop替换值
  • 你可以用这段代码演示一下
  • 对于索引 i,array1[i] 和 array[2] !== null 时的预期行为是什么?
  • const result = obj[0].map((_, i) => obj[1][i] || obj[0][i])

标签: javascript arrays


【解决方案1】:

假设您采用最后一次出现的子对象的值进行合并。

obj = [ [ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "YES", null, null, null, null, null, null, null, ], [ null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "YES", null, null, null, null, null, null, null, null, ], ];

const mergeObj = obj.reduce((acc, cur) => {
  return acc.map((el, i) => cur[i] ?? el);
});

console.log(mergeObj);

【讨论】:

    【解决方案2】:

    Array.reduce 实现。

    逻辑

    • obj 数组中的第一个节点指定为初始输出。
    • 先循环遍历obj数组,循环遍历obj中的单个数组,将每个节点的值分配为逻辑值或obj数组中的累加器和节点。

    const obj = [
      [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "YES", null, null, null, null, null, null, null],
      [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "YES", null, null, null, null, null, null, null, null]
    ]
    const result = obj.reduce((acc, curr) => {
      curr.forEach((node, index) => acc[index] = acc[index] || curr[index])
      return acc;
    });
    
    console.log(result);

    【讨论】:

    • 一个建议:如果想用第一个元素作为reduce()中的第一个acc,可以省略,默认为acc。因此,您首先不需要将obj[0] 设置为acc 的默认reduce()
    • @ikhvjs 这对我来说是一个信息。谢谢!!。
    【解决方案3】:

    试试这个:

    const obj = [
      [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "YES", null, null, null, null, null, null, null],
      [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "YES", null, null, null, null, null, null, null, null]
    ];
    
    let result = Array(obj[0].length).fill(null);
    result = result.map((val,idx)=>{
      return obj.map(item => item[idx]).find(item => item != null) || val;
    })
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2013-09-29
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多