开发者问题收集

JavaScript-合并两个不同大小的数组

2021-11-04
483

我有两个数组:

var array1= [1,3,5,7,9,11]
var array2= [undefined,4,6]

我需要合并数组 1 的一个元素,然后合并数组 2 的一个元素,等等。这是我的代码:

function mergeArrays(array1, array2){
    var array3 = []; 
    maxlength = Math.max(array1.length, array2.length);

for(i=0;i<maxlength;i++){   
    array3.push(array1[i]);  
    array3.push(array2[i]);
}      
    return console.log(array3);
}

现在的输出是:

array3 = [1,undefined,3,4,6,7,undefined,9,undefined,11,undefined]

我需要的输出是:

array3 = [1,undefined,3,4,6,7,8,11]

我的意思是,我不能使用 (!= undefined),因为如果数组中间有一个未定义,它必须在那里。

2个回答

您没有检查较短数组的长度。 您的函数正在获取一个大于数组长度的值,因此,额外的未定义。这应该可以完成工作

var array1 = [1, 3, 5, 7, 9, 11];
var array2 = [undefined, 4, 6];

function mergeArrays(array1, array2) {
  var array3 = [];
  maxlength = Math.max(array1.length, array2.length);

  for (i = 0; i < maxlength; i++) {
    if (i < array1.length) array3.push(array1[i]);
    if (i < array2.length) array3.push(array2[i]);
  }
  return console.log(array3);
}

mergeArrays(array1, array2);
sc0rp1on
2021-11-04

您可以获取两个数组的最大长度并循环,直到达到该值。循环时,检查是否已超出长度并推送结果。

const allEqual = (...args) =>
  ((head, ...tail) => tail.every(curr => curr === head))
  (args.map(v => JSON.stringify(v)));

const test = ({ actual, expected }) => {
  console.log(JSON.stringify(actual));
  console.log(allEqual(actual, expected));
};

const interlaceArrays = (...arrays) => {
  const result = [];
  const maxLen = Math.max(...arrays.map(({ length }) => length));
  for (let i = 0; i < maxLen; i++) {
    arrays.forEach(arr => {
      if (i < arr.length) result.push(arr[i]);
    })
  }
  return result;
};

const
  odd = [1, 3, 5, 7, 9, 11],
  even = [undefined, 4, 6],
  other = ['a', 'b'];

test({
  actual: interlaceArrays(odd, even),
  expected: [1, undefined, 3, 4, 5, 6, 7, 9, 11]
});

test({
  actual: interlaceArrays(odd, even, other),
  expected: [1, undefined, 'a', 3, 4, 'b', 5, 6, 7, 9, 11]
});
.as-console-wrapper { top: 0; max-height: 100% !important; }
Mr. Polywhirl
2021-11-04