给定数组arr1
,arr2
和newArr
(例如):
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"]
我正在尝试将两个数组(arr1
和arr2
)合并到一个数组(newArr
)中,以便newArr
抓取第一个数组(最多)来自arr1
的三个元素,然后来自arr2
的第一个(最多)三个元素,然后来自arr1
的下一个(最多)三个元素等。
我最初通过迭代arr1
的每个元素并检查索引是否可被3整除(for (var i = 0)
... if (i + 1 % 3 === 0)
)来解决这个问题,但是现在我认为这种方法在arr1.length % 3 !== 0
时是站不住脚的。
此外,这种合并程序是否有名称?
答案 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功能。