Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用es6扩展到concat多个阵列_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 使用es6扩展到concat多个阵列

Javascript 使用es6扩展到concat多个阵列,javascript,ecmascript-6,Javascript,Ecmascript 6,我们都知道你可以做到: let arr1 = [1,2,3]; let arr2 = [3,4,5]; let arr3 = [...arr1, ...arr2]; // [1,2,3,3,4,5] 但是如何使concat N数组具有动态性呢?仅使用扩展语法无法做到这一点,因为扩展语法要求您事先知道要连接多少个数组。但是,您可以编写以下函数: function concatN(...arguments) { let accumulator = []; for(let arg =

我们都知道你可以做到:

let arr1 = [1,2,3];
let arr2 = [3,4,5];
let arr3 = [...arr1, ...arr2]; // [1,2,3,3,4,5]

但是如何使concat N数组具有动态性呢?

仅使用扩展语法无法做到这一点,因为扩展语法要求您事先知道要连接多少个数组。但是,您可以编写以下函数:

function concatN(...arguments) {
    let accumulator = [];
    for(let arg = 0; arg < arguments.length; arg = arg + 1) {
        accumulator = [...accumulator, ...arguments[arg]];
    }
    return accumulator;
}

一个选项是使用
减少

let arrs = [[1, 2], [3, 4], [5, 6]];
arrs.reduce((a, b) => [...a, ...b], []);
当然,这是一个缓慢的解决方案(二次时间)。或者,如果您可以使用Lodash,
\uz.flatte
完全按照您的要求执行,并且执行效率更高(线性时间)

编辑

或者,根据Xotic750下面的评论改编

[].concat(...arrs);

这应该是有效的(线性时间)。

另一个选项可以是:

const nArrays=[
[1, 2, 3, 4, 5],
[6, 7, 8, 9],
[10, 11]
];
常数展平=[].concat(…nArrays);

console.log(展平)
您可以使用
for..of
循环中的扩展元素将数组值连接到单个数组

让arr1=[1,2,3];
设arr2=[3,4,5];
设arr3=[];
对于(让[arr1,arr2/*,arrN*/])arr3.push(…arr);

控制台日志(arr3)
您可以使用递归函数和
Array.prototype.concat

const concatN=(x,…xs)=>
x==未定义?[]:x.concat(concatN(…xs))
console.log(concatN([1,2,3],[4,5,6],[7,8,9]))
//[1,2,3,4,5,6,7,8,9]
让水果=[“苹果”、“香蕉”、“梨”];
让蔬菜=[“玉米”、“土豆”、“胡萝卜”];
让我们生产=[…水果,…蔬菜];

控制台。日志(生成)以下解决方案适用于我(ES6中的扩展运算符):

let array=['my','solution','works'];
设newArray=[];
设newArray2=[];
push(…数组)//添加到同一数组
newArray2.push([…数组])//添加为子/叶/子数组
log(newArray);

console.log(newArray2)我们可以通过以下方式使用es6解决

function mergeTwo(arr1, arr2) {
  let result = [...arr1, ...arr2];
  return result.sort((a,b) => a-b);
}
让arr1=[1,2,3];
设arr2=[3,4,5];
设arrs=[arr1,arr2].flat();//[1,2,3,3,4,5]

控制台日志(arrs)可以将动态数组存储在数组中…或将数组作为值的对象中。无法迭代未知数量的单个变量为什么必须使用扩展运算符?
concat
方法仍然有效…Array.prototype.concat不是为您做的吗?哦,哦,所以ES5ify
Function.prototype.call.bind(Array.prototype.concat)
:)如果你把数组放在一个数组中,你就可以了
Array.prototype.concat.apply([],arr)
虽然这不再使用扩展运算符。@Xotic750不错,但您可以使用扩展运算符来完成!请参阅我的编辑。请注意,在typescript中,如果希望返回值为
number[]
而不是
any[]
(例如
([]作为number[]),则需要强制键入空数组。concat(…arrs)
)此给定代码与给定问题完全相同。这不是为N个阵列制作Dynamicly concat解决方案的答案。从ES2019开始,您可以使用
nArrays.flat()
function mergeTwo(arr1, arr2) {
  let result = [...arr1, ...arr2];
  return result.sort((a,b) => a-b);
}