在一个数组中合并许多数组

时间:2014-07-31 22:04:33

标签: javascript arrays

我有3个像这样的数组

a = [1,1,1];
b = [2,2,2];
c = [3,3,3];

我想在一个数组中合并所有这些数组,以便结果应该是这个

d = [1,2,3,1,2,3,1,2,3];

我创建了一个执行此操作的函数:

function Merge()
{
    var result = [];
    var maxLength = 0;
    for(key in arguments)
        if(arguments[key].length>maxLength)
            maxLength = arguments[key].length;
    while(maxLength--)
        for(key in arguments)
            if(x=arguments[key].shift())
                result.push(x);
    return result;
}

问题是当我像这样调用函数Merge

d = Merge(a,b,c);

它将正确的数组返回到d变量,但是当我尝试打印a,b,c中的内容时,我发现所有这些都是空数组,因为我使用了shift()

然后我通过将arguments的值复制到另一个数组并使用该数组来纠正此错误

function Merge()
{
    var result = [];
    var maxLength = 0;
    var arg = JSON.parse(JSON.stringify(arguments));
    for(key in arg)
        if(arg[key].length>maxLength)
            maxLength = arg[key].length;
    while(maxLength--)
        for(key in arg)
            if(x=arg[key].shift())
                result.push(x);
    return result;
}

第一个问题:我无法理解的是为什么我转移arguments数组并更改a,b,c

第二个问题:有一种简单的方法吗?

2 个答案:

答案 0 :(得分:0)

改变移位数组的移位的目的。使用普通索引逐步执行数组:

for (var i=0; i<arg.length; i++) { result.push(arg[i]); }

答案 1 :(得分:0)

回答你的第一个问题

  

Array.prototype.shift()方法从数组中删除第一个元素   并返回该元素。此方法更改数组的长度。   (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift

此函数将合并n个数组而不修改它们。

function merge(){
   var result = [],
       lengths = [],
       max_len,
       num_args = arguments.length;

    for( i = 0; i < num_args; i++ ) {
        lengths.push( arguments[ i ].length );
    }
    max_len = Math.max.apply( null, lengths );

    for( i = 0; i < max_len; i++ ){
        for( j = 0; j < num_args; j++ ) {
            if( arguments[ j ][ i ] != null ) {
                result.push( arguments[ j ][ i ] );
            }
        }
    }
    return result;
}