如何合并javascript数组和按位置排序?

时间:2011-05-26 19:54:25

标签: javascript arrays

无论如何通过按索引/位置排序来合并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()来一个接一个地放。

9 个答案:

答案 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)

Eli打败了我的拳头。

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);

示例:http://jsfiddle.net/HH9SR/