无论如何通过按索引/位置排序来合并javascript中的数组。我试图完成这个并且找不到任何这方面的例子。
var array1 = [1,2,3,4]
var array2 = [a,b,c,d]
var array3 = [!,@,#,$]
var merged array = [1,a,!,2,b,@,3,c,#,4,d,$]
我知道你可以使用concat()来一个接一个地放。
答案 0 :(得分:3)
只要阵列长度相同,您就可以这样做:
var mergedArray = [];
for (var i = 0, il = array1.length; i < il; i++) {
mergedArray.push(array1[i]);
mergedArray.push(array2[i]);
mergedArray.push(array3[i]);
}
修改强> 对于不同长度的数组,您可以这样做:
var mergedArray = [];
for (var i = 0, il = Math.max(array1.length, array2.length, array3.length);
i < il; i++) {
if (array1[i]) { mergedArray.push(array1[i]); }
if (array2[i]) { mergedArray.push(array2[i]); }
if (array3[i]) { mergedArray.push(array3[i]); }
}
答案 1 :(得分:2)
对于大小相同的数组,您将一个或多个数组作为要合并的参数传递:
function merge()
{
var result = [];
for (var i=0; i<arguments[0].length; i++)
{
for (var j=0; j<arguments.length; j++)
{
result.push(arguments[j][i]);
}
}
return result;
}
var array1 = ['1','2','3','4'];
var array2 = ['a','b','c','d'];
var array3 = ['!','@','#','$'];
var merged = merge(array1, array2, array3);
答案 2 :(得分:1)
这适用于任何长度的数组:
var mergeArrays = function () {
var arr = [],
args = arr.slice.call(arguments),
length = 0;
for (var i = 0, len = args.length; i < len; i++) {
length = args[i].length > length ? args[i].length : length;
}
for (i = 0; i < length; i++) {
for (var j = 0; j < len; j++) {
var value = args[j][i];
if (value) {
arr.push(value);
}
}
}
return arr;
};
示例:
var array1 = [1,2,3,4];
var array2 = ['a','b','c','d','e','f','g','h','i','j','k','l'];
var array3 = ['!','@','#','$','%','^','&','*','('];
mergeArrays(array1, array2, array3);
// outputs: [1, "a", "!", 2, "b", "@", 3, "c", "#", 4, "d", "$", "e", "%", "f", "^", "g", "&", "h", "*", "i", "(", "j", "k", "l"]
这也可以(稍微简洁的语法):
var mergeArrays = function () {
var arr = [],
args = arr.slice.call(arguments),
length = Math.max.apply(null, args.map(function (a) { return a.length; }));
for (i = 0; i < length; i++) {
for (var j = 0, len = args.length; j < len; j++) {
var value = args[j][i];
if (value) {
arr.push(value);
}
}
}
return arr;
};
答案 3 :(得分:0)
没有内置,但管理起来并不困难:
var maxLength = Math.max(array1.length, array2.length, array3.length),
output = [];
for (var i = 0; i < maxLength; i++) {
if (array1[i] != undefined) output.push(array1[i]);
if (array2[i] != undefined) output.push(array2[i]);
if (array3[i] != undefined) output.push(array3[i]);
}
答案 4 :(得分:0)
试试这个......
var masterList = new Array();
var array1 = [1,2,3,4];
var array2 = [a,b,c,d];
var array3 = [!,@,#,$];
for(i = 0; i < array1.length; i++) {
masterList.push(array1[i]);
masterList.push(array2[i]);
masterList.push(array3[i]);
}
答案 5 :(得分:0)
看起来你想把一些相同长度的数组“压缩”成一个数组:
var zip = function() {
var numArrays=arguments.length
, len=arguments[0].length
, arr=[], i, j;
for (i=0; i<len; i++) {
for (j=0; j<numArrays; j++) {
arr.push(arguments[j][i]);
}
}
return arr;
};
zip([1,2], ['a', 'b']); // => [1, 'a', 2, 'b']
zip([1,2,3], ['a','b','c'], ['!','@','#']); // => [1,'a','@',...,3,'c','#']
如果输入数组的长度可能不同,那么你必须弄清楚如何处理这种情况......
答案 6 :(得分:0)
这适用于任意数量的数组和任何长度的数组。
function myMerge() { var result = [], maxLength = 0; for (var i = 0; i < arguments.length; i++) { if (arguments[i].length > maxLength) { maxLength = arguments[i].length; } } for (var i = 0; i < maxLength; i++) { for (var j = 0; j < arguments.length; j++) { if (arguments[j].length > i) { result.push(arguments[j][i]); } } } return result; }
答案 7 :(得分:0)
是的,有一些方法可以做到这一点。只是:
生成的数组将具有由原始数组中的索引排序的元素。根据您的决定取决于其中一个阵列具有更高优先级的位置。
答案 8 :(得分:0)
var posConcat = function() {
var arrays = Array.prototype.slice.call(arguments, 0),
newArray = [];
while(arrays.some(notEmpty)) {
for(var i = 0; i < arrays.length; i++) {
if(arguments[i].length > 0)
newArray.push(arguments[i].shift());
}
}
return newArray;
},
notEmpty = function() { return arguments[0].length > 0; };
用法:
var orderedArray = posConcat(array1,array2,array3);