一次合并两个Javascript数组三个元素

时间:2016-04-08 14:32:50

标签: javascript arrays algorithm

给定数组arr1arr2newArr(例如):

var arr1 = ["a1", "a2", "a3", "a4", "a5"]
var arr2 = ["b1", "b2", "b3", "b4", "b5"]
var newArr = ["a1", "a2", "a3", "b1", "b2", "b3", "a4", "a5", "b4", "b5"]

我正在尝试将两个数组(arr1arr2)合并到一个数组(newArr)中,以便newArr抓取第一个数组(最多)来自arr1的三个元素,然后来自arr2的第一个(最多)三个元素,然后来自arr1的下一个(最多)三个元素等。

我最初通过迭代arr1的每个元素并检查索引是否可被3整除(for (var i = 0) ... if (i + 1 % 3 === 0))来解决这个问题,但是现在我认为这种方法在arr1.length % 3 !== 0时是站不住脚的。

此外,这种合并程序是否有名称?

3 个答案:

答案 0 :(得分:2)

怎么样......

__repr__

答案 1 :(得分:1)

对不起,你有没有时间谈论我们的主和救主,递归?

/**
 * @param {number[]} arr1
 * @param {number[]} arr2
 */
function threeMerge(arr1, arr2) {

    /**
    * @param {number[]} arr1
    * @param {number[]} arr2
    * @param {number[]} currentArr
    */
    var threeMergeRecursive = function(arr1, arr2, currentArr) {
        if(arr1.length < 3 || arr2.length < 3){
            return currentArr.concat(arr1, arr2);
    } else if (arr2.length < 3) {
        var resultArr = currentArr.concat(
            arr1.slice(0, 3),
            arr2
        );

        return threeMergeRecursive(
            arr1.slice(0, 3),
            [],
            resultArr
        );
    } else {
            var resultArr = currentArr.concat(
                arr1.slice(0, 3),
                arr1.slice(0, 3)
                );

            return threeMergeRecursive(
                arr1.slice(3),
                arr2.slice(3),
                resultArr);
        }
    };

    return(threeMergeRecursive(arr1, arr2, []));
};

答案 2 :(得分:1)

基本解决方案是同时循环两个索引。 这是解决方案

var arr1 = ["a1", "a2", "a3", "a4", "a5"],
    arr2 = ["b1", "b2", "b3", "b4", "b5"],
    newArr = [];

for (let a=0, b=0; a<arr1.length || b<arr2.length; ) {
  if (a==b) {
    newArr.push(...arr1.slice(a,a+=3)) }
  else {
    newArr.push(...arr2.slice(b,b+=3)) }
}

请注意示例代码使用let和数组取消装箱ES6功能。