思考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;
以嵌套数组结尾,并且不起作用。
答案 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]