JavaScript Array.concat和推送解决方法

时间:2018-07-11 11:22:01

标签: javascript arrays concat

思考Array.concat总是很棘手。通常,我只想使用可变的Array.push,因为我只是在不可变数据上添加了额外数据。因此,我通常这样做:

array[array.length] = newData;

我问了一个相关的问题,这里有一些答案:How to store data of a functional chain

const L = (a) => {
  const m = a => (m.list ? m.list : m.list = [])
        .push(a) && m; 
  //use `concat` and refactor needed instead of `push` 
  //that is not immutable
  return m(a); // Object construction!
};

console.log(L);
console.log(L(2));
console.log(L(1)(2)(3))

一些输出:

{ [Function: m] list: [ 2 ] } 
{ [Function: m] list: [ 1, 2, 3 ] }

我认为push应该替换为concat,但是push仍然使代码优雅,只是因为我们不想在这里准备另一个对象。

基本上,我想这样做:

arr1 = arr1.concat(arr2);

但是,有什么办法写

arr1[arr1.length] = arr2;

以嵌套数组结尾,并且不起作用。

3 个答案:

答案 0 :(得分:1)

您可以为未指定的Double分配一个具有默认数组的新数组。

m.list

答案 1 :(得分:0)

arr1[arr1.length]代表一个值,即索引arr1.length处的值。

想象一下这个数组

[ 1 , 2 , 3 , 4 ]  // arr of length 4
  ^0  ^1  ^2  ^3   // indexes

如果我们说arr1[arr1.length] = someThing

我们要求javascript在此处放置内容,并且仅在此处放置索引4

[ 1 , 2 , 3 , 4 ,   ] // arr of length 4
  ^0  ^1  ^2  ^3  ^4  // add someThing in index 4

因此,如果我们要严格使用arr1[arr1.length]添加一些内容,那么我们需要继续对每个索引进行添加。每个 表示任何形式的循环。例如:

// Not recommended to use
var arr1 = [1,2,3];
var arr2 = [3,4,5];

while (arr2.length){
  arr1[arr1.length] = arr2.shift();
}

console.log(arr1); // [1,2,3,3,4,5]
console.log(arr2); // []

但是,如您所见,此方法或任何类似的方法(即使已优化)也不是正确的方法。您需要串联。

由于您提到的是一个可以返回结果的数组的功能性数组,因此您只需替换初始数组并使用spread operator

var arr1 = [1,2,3];
var arr2 = [3,4,5];
console.log(arr1 = [...arr1,...arr2]); // [1,2,3,3,4,5]

答案 2 :(得分:0)

您可以在Array.push中使用多个参数,这样:

var a = [];
a.push(3, 4) // a is now [3, 4]

与ES6 spread syntax组合:

var a = [1, 2];
var b = [3, 4]
a.push(...b); // a is now [1, 2, 3, 4]