在Javascript中连接数组

时间:2015-01-16 21:54:38

标签: javascript arrays concat reduce

我是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

为什么??? ???

3 个答案:

答案 0 :(得分:5)

简单方法:

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]]) 

答案 1 :(得分: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方法。由于concatundefined,因此您无法将其称为函数。

答案 2 :(得分:0)

我们也可以使用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]