我有一个JavaScript数组dataArray,我想把它推到一个新数组newArray。只是我不想让newArray[0]为dataArray。我想把所有的项都推入新数组:

var newArray = [];

newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...

或者更好:

var newArray = new Array (
   dataArray1.values(),
   dataArray2.values(),
   // ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);

现在新数组包含了各个数据数组的所有值。是否有一些像pushValues这样的速记可用,这样我就不必遍历每个单独的数据数组,逐个添加项?


当前回答

性能

我分析了当前的解决方案,并提出了2个新的(F和G在详细部分提出)一个是非常快的中小型阵列

今天2020.11.13我在Chrome v86、Safari v13.1.2和Firefox v82上对所选解决方案的MacOs HighSierra 10.13.6进行测试

结果

适用于所有浏览器

对于中小型数组,基于while-pop-unshift (F,G)的解决方案在所有浏览器上(非常)最快。对于有50000个元素的数组,这个解决方案在Chrome上变慢 解决方案C,D数组500000中断:“RangeError:最大调用堆栈大小超过 解(E)最慢

细节

我执行2个测试用例:

当数组有10个元素时,你可以在这里运行它 当数组有10k个元素时-你可以在这里运行它

下面的代码片段展示了解决方案之间的差异 一个, B, C, D, E, F(我) G(我) H, 我

// https://stackoverflow.com/a/4156145/860099 function A(a,b) { return a.concat(b); } // https://stackoverflow.com/a/38107399/860099 function B(a,b) { return [...a, ...b]; } // https://stackoverflow.com/a/32511679/860099 function C(a,b) { return (a.push(...b), a); } // https://stackoverflow.com/a/4156156/860099 function D(a,b) { Array.prototype.push.apply(a, b); return a; } // https://stackoverflow.com/a/60276098/860099 function E(a,b) { return b.reduce((pre, cur) => [...pre, cur], a); } // my function F(a,b) { while(b.length) a.push(b.shift()); return a; } // my function G(a,b) { while(a.length) b.unshift(a.pop()); return b; } // https://stackoverflow.com/a/44087401/860099 function H(a, b) { var len = b.length; var start = a.length; a.length = start + len; for (var i = 0; i < len; i++ , start++) { a[start] = b[i]; } return a; } // https://stackoverflow.com/a/51860949/860099 function I(a, b){ var oneLen = a.length, twoLen = b.length; var newArr = [], newLen = newArr.length = oneLen + twoLen; for (var i=0, tmp=a[0]; i !== oneLen; ++i) { tmp = a[i]; if (tmp !== undefined || a.hasOwnProperty(i)) newArr[i] = tmp; } for (var two=0; i !== newLen; ++i, ++two) { tmp = b[two]; if (tmp !== undefined || b.hasOwnProperty(two)) newArr[i] = tmp; } return newArr; } // --------- // TEST // --------- let a1=[1,2,3]; let a2=[4,5,6]; [A,B,C,D,E,F,G,H,I].forEach(f=> { console.log(`${f.name}: ${f([...a1],[...a2])}`) })

这里是chrome的示例结果

其他回答

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    //Scanner sc=new Scanner(System.in);
    
    int[] ij= {1,4,222,455,111};
    int[] ijk=Arrays.copyOf(ij,ij.length);
    for(int i=0;i<ij.length;i++) {
        System.out.print(i);
    }
    System.out.println(" ");
    for(int i=0;i<ijk.length;i++) {
        System.out.print(i);
    }
    
    
}

输出: 01234 01234

性能

我分析了当前的解决方案,并提出了2个新的(F和G在详细部分提出)一个是非常快的中小型阵列

今天2020.11.13我在Chrome v86、Safari v13.1.2和Firefox v82上对所选解决方案的MacOs HighSierra 10.13.6进行测试

结果

适用于所有浏览器

对于中小型数组,基于while-pop-unshift (F,G)的解决方案在所有浏览器上(非常)最快。对于有50000个元素的数组,这个解决方案在Chrome上变慢 解决方案C,D数组500000中断:“RangeError:最大调用堆栈大小超过 解(E)最慢

细节

我执行2个测试用例:

当数组有10个元素时,你可以在这里运行它 当数组有10k个元素时-你可以在这里运行它

下面的代码片段展示了解决方案之间的差异 一个, B, C, D, E, F(我) G(我) H, 我

// https://stackoverflow.com/a/4156145/860099 function A(a,b) { return a.concat(b); } // https://stackoverflow.com/a/38107399/860099 function B(a,b) { return [...a, ...b]; } // https://stackoverflow.com/a/32511679/860099 function C(a,b) { return (a.push(...b), a); } // https://stackoverflow.com/a/4156156/860099 function D(a,b) { Array.prototype.push.apply(a, b); return a; } // https://stackoverflow.com/a/60276098/860099 function E(a,b) { return b.reduce((pre, cur) => [...pre, cur], a); } // my function F(a,b) { while(b.length) a.push(b.shift()); return a; } // my function G(a,b) { while(a.length) b.unshift(a.pop()); return b; } // https://stackoverflow.com/a/44087401/860099 function H(a, b) { var len = b.length; var start = a.length; a.length = start + len; for (var i = 0; i < len; i++ , start++) { a[start] = b[i]; } return a; } // https://stackoverflow.com/a/51860949/860099 function I(a, b){ var oneLen = a.length, twoLen = b.length; var newArr = [], newLen = newArr.length = oneLen + twoLen; for (var i=0, tmp=a[0]; i !== oneLen; ++i) { tmp = a[i]; if (tmp !== undefined || a.hasOwnProperty(i)) newArr[i] = tmp; } for (var two=0; i !== newLen; ++i, ++two) { tmp = b[two]; if (tmp !== undefined || b.hasOwnProperty(two)) newArr[i] = tmp; } return newArr; } // --------- // TEST // --------- let a1=[1,2,3]; let a2=[4,5,6]; [A,B,C,D,E,F,G,H,I].forEach(f=> { console.log(`${f.name}: ${f([...a1],[...a2])}`) })

这里是chrome的示例结果

var a=new Array('a','b','c');
var b=new Array('d','e','f');
var d=new Array('x','y','z');
var c=a.concat(b,d)

这能解决你的问题吗?

我提供了两种简单的方法:

解决方案1:

let dataArray1= [0, 1];
let dataArray1= [2, 3];
dataArray1.push(...dataArray2);
console.log(dataArray1) 

解决方案2:

let dataArray1 = [1, 2];
let dataArray2 = [3, 4];
let newArray = dataArray1.concat(dataArray2);
console.log(newArray)

使用concat函数,如下所示:

var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayA.concat(arrayB);

newArray的值将是[1,2,3,4](arrayA和arrayB保持不变;Concat为结果创建并返回一个新数组)。