如何在JavaScript中合并两个数组并保持其顺序

时间:2017-01-12 08:57:17

标签: javascript arrays multidimensional-array

我有一个白板任务让我在面试中难过,但是我已经写了一个解决方案,并且想知道是否有人对它进行了改进,因为我正在迭谈面试官所说的那些。必须将两个数组合并为array1[0], array2[0], array1[1], array2[1]...的订单(请参阅expectedResult)等



const options = [[1, 12, 5], ["a", "b", "c", "d", "e"]]
const expectedResult = [1, "a", 12, "b", 5, "c", "d", "e"]

function mergeArrays(first, second) {
  let returnArray = []
  
  first.forEach((value, key) => {
    returnArray.push(value)
    if (second[key]) returnArray.push(second[key])
    if (!first[key + 1] && second[key + 1]) {
      returnArray.push(
        ...second.slice(key + 1, second.length)
      )
    }
  })
  return returnArray
}

const result = mergeArrays(options[0], options[1])
console.log(result.toString() === expectedResult.toString(), result)




4 个答案:

答案 0 :(得分:3)

我采用经典的方式,使用while循环,因为它最小化了循环内部的检查,并且在没有另外检查的情况下附加其中一个数组的其余部分。



function mergeArrays(first, second) {
    var min = Math.min(first.length, second.length),
        i = 0,
        result = [];

    while (i < min) {
        result.push(first[i], second[i]);
        ++i;
    }
    return result.concat(first.slice(min), second.slice(min));
}

const options = [[1, 12, 5], ["a", "b", "c", "d", "e"]];

console.log(mergeArrays(...options));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:3)

使用reduce(作为经典for / while循环控制结构的替代)

&#13;
&#13;
const options = [[1, 12, 5], ["a", "b", "c", "d", "e"]];
const expectedResult = [1, "a", 12, "b", 5, "c", "d", "e"]

result = options[0].reduce(function (a, cV, cI) {
    return a.concat([cV,options[1][cI]]);
},[]);


result = result.concat(options[1].splice(options[0].length));
console.log(result.toString() === expectedResult.toString(), result)
&#13;
&#13;
&#13;

答案 2 :(得分:2)

不使用if条件中的值,而是检查数组的长度。

我在代码中看到的问题是条件

   if (second[key]) returnArray.push(second[key])
   // will not run if second[key] is 0,null,undefined.
   if (!first[key + 1] && second[key + 1]) 
   // will produce unwanted result if value reference is 0,null,undefined.

所以相反,检查长度会产生更好的结果 条件

    if (second[key]) returnArray.push(second[key]) 

可以改为

   if( second.length > key) returnArray.push(second[key]) 

答案 3 :(得分:0)

您可以使用递归压缩功能,使用spread将两个数组作为其参数:

var z = (a, b) => a.length ? [a[0], ...z(b, a.slice(1))] : b;

var options = 
[
    [1, 12, 5], 
    ["a", "b", "c", "d", "e"]
];

var expectedResult = z(...options);
console.log(JSON.stringify(expectedResult));

或用于任意数量的数组输入:

var z = (a = [], ...b) => 
    b.length ? a.length ? [a[0], ...z(...b, a.slice(1))] : z(...b) : a;

var options = 
[
    [1, 2], 
    '♦♡♣♤♥♢', 
    ['A', 'B', 'C'], 
    ['', '', ''], 
    [null, NaN, undefined]
];

var expectedResult = z(...options);
var stringify = (o) => JSON.stringify(o, (k, v) => v === undefined ? '__undefined__' : v !== v ? '__NaN__' : v).replace(/"__undefined__"/g, 'undefined').replace(/"__NaN__"/g, 'NaN');
console.log(stringify(expectedResult));