我是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
为什么??? ???
答案 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)
首先,请注意您已将reducedArray
和completeArray
声明为空对象({}
)。创建空数组的语法是:
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
,因此您无法将其称为函数。
答案 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]