将数组项复制到另一个数组中。

1214

我有一个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的速记方法可用,以便我不必逐个迭代每个dataArray,逐一添加项目?


请参阅此网址https://dev59.com/JXRC5IYBdhLWcg3wSu57 - Jakir Hossain
这应该是答案 https://davidwalsh.name/combining-js-arrays - starikovs
这个回答是否解决了你的问题?如何在JavaScript中合并两个数组并去重 - HackerMan
20个回答

11

如果你想修改原始数组,可以使用展开运算符和push方法:

var source = [1, 2, 3];
var range = [5, 6, 7];
var length = source.push(...range);

console.log(source); // [ 1, 2, 3, 5, 6, 7 ]
console.log(length); // 6

如果你想确保只有相同类型的项目进入source数组(例如不混合数字和字符串),那么请使用TypeScript。
/**
 * Adds the items of the specified range array to the end of the source array.
 * Use this function to make sure only items of the same type go in the source array.
 */
function addRange<T>(source: T[], range: T[]) {
    source.push(...range);
}

9

以下是 ES6 的写法

var newArray = [];
let dataArray1 = [1,2,3,4]
let dataArray2 = [5,6,7,8]
newArray = [...dataArray1, ...dataArray2]
console.log(newArray)

以上方法适用于大多数情况,如果不适用,请考虑使用concat,例如你有成千上万个数组项。

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


9

性能

我分析了当前的解决方案,并提出了两个新的解决方案(详见详细部分中的 F 和 G)。

今天是2023年3月15日,我在 MacOs Monterey 12.1(M1,16GB)上使用 Chrome v109、Safari v15.2 和 Firefox v110 对所选解决方案进行测试。

结果

对于所有浏览器:

  • 基于 concat 的解决方案(A)在 Chrome 和 Safari 上针对大型数组最快,在 Firefox 上也相当快。对于小型数组也相当快。
  • 基于 for 的解决方案(H)在 Firefox 上最快,在其他浏览器上速度中等。
  • 解决方案 C、D 在 Chrome 上针对小型数组最快。
  • 基于 reduce 的解决方案(E)最慢。

enter image description here

详情

我进行了两个测试案例:

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

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

// https://dev59.com/kW855IYBdhLWcg3ww3Wa#4156145
function A(a,b) {
  return a.concat(b);
}

// https://dev59.com/kW855IYBdhLWcg3ww3Wa#38107399 
function B(a,b) {
  return [...a, ...b];
}

// https://dev59.com/kW855IYBdhLWcg3ww3Wa#32511679
function C(a,b) {
  return (a.push(...b), a);
}

// https://dev59.com/kW855IYBdhLWcg3ww3Wa#4156156
function D(a,b) {
    Array.prototype.push.apply(a, b);
    return a;
}

// https://dev59.com/kW855IYBdhLWcg3ww3Wa#60276098
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://dev59.com/kW855IYBdhLWcg3ww3Wa#44087401
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://dev59.com/kW855IYBdhLWcg3ww3Wa#51860949
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的示例结果

enter image description here


哇,这是惊人的答案!非常感谢!!我尝试了F的一个变体,使数组b不被消除,结果计算速度慢了100%!真的很奇怪。```function F2(a,b){ for(elem of b) a.push(elem); return a; }F2(a,b);``` - Sarang
1
@Sarang 的原因是每次测试用例执行后,数组 ab 没有被重置 - 因此当我们使用 shift/pop 时,在测试用例执行期间我们迅速将数组大小减少到零(这解释了 F 和 G 的“高性能”)。感谢您的评论 - 我更新并执行新的测试,并重新编写答案。 - Kamil Kiełczewski
哦,该死!感谢更新!这就是社区协作的最佳体现 :-) - Sarang

8

有很多答案都提到了 Array.prototype.push.apply。这里有一个清晰的例子:

var dataArray1 = [1, 2];
var dataArray2 = [3, 4, 5];
var newArray = [ ];
Array.prototype.push.apply(newArray, dataArray1); // newArray = [1, 2]
Array.prototype.push.apply(newArray, dataArray2); // newArray = [1, 2, 3, 4, 5]
console.log(JSON.stringify(newArray)); // Outputs: [1, 2, 3, 4, 5]

如果您有ES6语法:

var dataArray1 = [1, 2];
var dataArray2 = [3, 4, 5];
var newArray = [ ];
newArray.push(...dataArray1); // newArray = [1, 2]
newArray.push(...dataArray2); // newArray = [1, 2, 3, 4, 5]
console.log(JSON.stringify(newArray)); // Outputs: [1, 2, 3, 4, 5]


2
我们有两个数组a和b。这里的代码是将数组a的值推送到数组b中。
let a = [2, 4, 6, 8, 9, 15]

function transform(a) {
    let b = ['4', '16', '64']
    a.forEach(function(e) {
        b.push(e.toString());
    });
    return b;
}

transform(a)

[ '4', '16', '64', '2', '4', '6', '8', '9', '15' ]

1
请不要仅仅将代码作为答案发布。请解释代码的作用以及它如何解决问题。 - Patrick Hund

0

试试这个:

var arrayA = [1, 2];
var arrayB = [3, 4];
var newArray = arrayB.reduce((pre, cur) => [...pre, ...cur], arrayA);
console.log(newArray)

0
或者,您也可以以以下方式编写concat方法:

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


-3

这是一段可用的代码,它能够正常工作:

var els = document.getElementsByTagName('input'), i;
var invnum = new Array();
var k = els.length;
for(i = 0; i < k; i++){invnum.push(new Array(els[i].id,els[i].value))}

-3

在IE中使用concat函数代替push()函数。例如:

var a=a.concat(a,new Array('amin'));

1
两者都非常兼容IE。 - Jack G

-5
    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


3
这是一个JavaScript问题,而您正在使用Java回答。 - Shreck Ye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接