不使用concat方法将两个数组相加

17

这是我想要做的一个示例

function test(r){
  var arr = ['d','e','f'];
  r.push(arr);
  /*
  More Code
  */
  return r;
}
var result = test(['a','b','c']);
alert(result.length);//I want this to alert 6
我需要做的是传入一个数组,并将其他数组附加到其末尾,然后返回该数组。由于参数按引用传递,我不能使用array.concat(array2)。有没有一种方法可以不使用for循环逐个添加元素来实现这一点?我尝试了类似于r.push(arr.join()),但那也行不通。而且,我希望在数组中可以有对象,所以r.push(arr.join())并不太适用。
3个回答

60
>>> var x = [1, 2, 3], y = [4, 5, 6];
>>> x.push.apply(x, y) // or Array.prototype.push.apply(x, y)
>>> x
[1, 2, 3, 4, 5, 6]

或者使用解构,现在可以这样做:

//generate a new array
a=[...x,...y];
//or modify one of the original arrays
x.push(...y);

有趣的apply用法,将一个数组的所有成员加1并推入另一个数组。 - meouw
我以前见过apply方法,但从未真正理解它(自己需要研究一下apply),但它确实是我想要的简洁方式。然而第二种方法与第一种方法有何不同?它使用Array.prototype而不是x.push.apply。 - qw3n
两者是等价的。调用 x.push(y) 的意思是“使用作用域 x 和参数 [y] 调用函数 x.push”。在这种情况下,x.push 解析为 Array.prototype.push,因此:Array.prototype.push.apply(x, [y])。我之所以提到第二种形式,是因为有时仅引用一次 x 更可取。 - emulbreh
x.push.apply(x, y) 对我很有帮助,特别是第二个 x,尽管我不明白为什么要这样写。 - Barbz_YHOOL

2
function test(r){
  var _r = r.slice(0), // copy to new array reference
      arr = ['d','e','f'];

  _r = _r.concat(arr); // can use concat now

  return _r;
}
var result = test(['a','b','c']);
alert(result.length); // 6

4
错误,你返回的数组不是传递给函数的修改后的数组,而是它的一个副本。 - meouw

1

这是emulbreh的答案,我只是发布了我进行验证的测试。 所有的功劳都应归于emulbreh。

// original array
var r = ['a','b','c'];

function test(r){
  var arr = ['d','e','f'];
  r.push.apply(r, arr);

  /*
  More Code
  */
  return r;
}
var result = test( r );
console.log( r ); // ["a", "b", "c", "d", "e", "f"]
console.log( result === r ); // the returned array IS the original array but modified

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