繁体   English   中英

在Javascript中连接数组

[英]Concatenating arrays in Javascript

我是javascript的新手,我有一个问题,使用reduce和concat函数将几个数组展平为一个完整的数组。

var array = [ [1, 3], [6, 6], [3, 3] ]; 

var finishedArray = function(array) {
var reducedArray = {};
var completeArray = {};


for (var i = 0; i < array.length; i++) {
    reducedArray[i] = array[i].reduce(function (a, b) {
        return a + b;
    });

    completeArray = reducedArray[i].concat(reducedArray[i + 1]);
}

return completeArray;

}

console.log(finishedArray(array));`

我得到的错误是: completeArray = reducedArray[i].concat(reducedArray[i + 1]) ;

TypeError: undefined is not a function

这是为什么???

简单的方法:

var finishedArray = [ [1, 3], [6, 6], [3, 3] ].reduce(Function.apply.bind([].concat), [])

另一个比可读性更好的选择是使用命名函数,它允许您在许多地方将此转换应用于许多数组,而不是每次都有如此丑陋的样板:

function flat(a,b){return a.concat(b);}

[[1,3],[6,6],[3,3]].reduce(flat);
[[7,3],[4,6],[8,1]].reduce(flat);

这是压扁许多不同阵列的最短路径。

请注意,您也可以使用与我的第一个建议相同的快速但难看的语法编写可重用的文本:

 var flat=Function.apply.bind([].concat);

还要注意,elclanrs显示了一个我更喜欢的更简单的方法:

 [].concat.apply([],[[1,3],[6,6],[3,3]]) 

@Dandavis提供了一个非常好的答案,展示了如何“展平”锯齿状阵列 - 将数组数组转换为包含原始数组所有元素的单个数组。 我将尝试解释您为什么会收到错误,并希望提高您对这些方法的理解。

首先,请注意您将reducedArraycompleteArray声明为空对象( {} )。 创建空数组的语法是:

var reducedArray = [];
var completeArray = [];

一旦你解决了这个问题,你仍然会遇到问题。 在这个声明中:

reducedArray[i] = array[i].reduce(function (a, b) {
    return a + b;
});

reduce方法将输入数组(在本例中为array[i] )转换为单个值,方法是将每个连续项相加并返回最终结果。 注意这会返回什么:

var array = [ [1, 3], [6, 6], [3, 3] ]; 
for (var i = 0; i < array.length; i++) {
    reducedArray[i] = array[i].reduce(function (a, b) {
        return a + b;
    });
}
console.log(reducedArray); // [4, 12, 6]

这意味着reducedArray[i]实际上是一个数字,而不是数组,并且Number类型上没有concat方法。 因为concat undefined ,所以不能像函数一样调用它。

我们也可以使用Arrow function执行此操作,如:

var array = [ [1, 3], [6, 6], [3, 3] ];
var finishedArray = array.reduce((e, f) => e.concat(f), []);


演示:

 var array = [ [1, 3], [6, 6], [3, 3] ]; var finishedArray = array.reduce((e, f) => e.concat(f), []); // Output console.log( finishedArray ); 

这将给出如下输出:

[1, 3, 6, 6, 3, 3]


如果您在此finishedArray变量中需要唯一值,您还可以执行以下操作:

var uniqueArray = [...new Set(finishedArray)];

演示:

 var array = [ [1, 3], [6, 6], [3, 3] ]; var finishedArray = array.reduce((e, f) => e.concat(f), []); var uniqueArray = [...new Set(finishedArray)]; // Output console.log( uniqueArray ); 

这个输出就像:

[1, 3, 6]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM