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

How to merging javascript arrays and order by position?

本文关键字:数组 位置 排序 javascript 何合并 合并      更新时间:2023-09-26

是否可以通过按索引/位置排序来合并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()把一个放在另一个后面。

只要数组的长度都一样,你就可以做:

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

这应该适用于任何长度的数组:

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

对于大小相同的数组,将一个或多个数组作为参数进行合并:

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

没有内置,但管理起来并不困难:

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

试试这个。。。

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

看起来你想把一些相同长度的数组"压缩"成一个数组:

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','#']

如果输入数组的长度可能不同,那么你必须弄清楚如何处理这种情况。。。

是的,有一些方法可以做到这一点。只是:

  • 循环通过较大的阵列
  • 直到在当前处理的位置两个阵列都具有元素、将它们逐一分配给新阵列
  • 在较短的阵列结束之后仅分配来自较长阵列的元素

生成的数组将按照原始数组中的索引对元素进行排序。根据您的决定,其中一个数组的优先级将更高。

这适用于任何数量的数组和任何长度的数组。

函数myMerge(){var结果=[],maxLength=0;for(var i=0;i<arguments.length;i++){if(arguments[i].length>maxLength){maxLength=arguments[i].lengage;}}for(var i=0;i<maxLength;i++){for(var j=0;j<arguments.length;j++){if(arguments[j].length>i){result.prush(arguments[j][i]);}}}返回结果;}

伊莱在那里把我打得落花流水。

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/