对于我的生活,我无法弄清楚我在这里做错了什么。
我试图同时使用reduce和concat数组方法来获取2d数组的所有值并将它们组合成单个值(基本上将它们压缩成一个数组,然后将它们相加)。
我一直遇到的问题是当我尝试使用for / loop来连接每个数组元素时,我传入函数的参数不会被识别为数组,因此我的调用到.concat()失败了。我在函数的开头放置了一个console.log(),以查看该元素是否被识别为2d数组中的第一个数组元素,并且它将作为" 1& #34;(?)。
我在函数外部尝试了另一个测试,并将其记录为实际的数组元素。我在这做错了什么?代码如下:
var arrays = [[1, 2, 3], [4, 5], [6]];
var myArray = arrays[0]; // Test
console.log(myArray); // Test
var flatArray = arrays.reduce(function(arrays)
{
console.log(arrays[0]); // Test
for (var i = 0; i < arrays.length - 1; i++)
{
arrays[0].concat(arrays[i+1]);
}
return arrays;
});
console.log(flatArray);
这是我不断获得的输出:
Array [ 1, 2, 3 ]
1
TypeError: arrays[0].concat is not a function
在函数内部,数组似乎正在被转换为数字类型......?
答案 0 :(得分:3)
您的代码中有错误:
var flatArray = arrays.reduce(function(param) {})
该param将是数组向量的元素。
选中此https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
答案 1 :(得分:1)
您错误地使用了.reduce()
,甚至不需要使用它来展平数组。你可以这样做:
var flatArray = [].concat.apply([],arrays);
工作演示:http://jsfiddle.net/jfriend00/wfjyfp42/
要理解.reduce()
,您传递的回调会获得四个参数(请参阅MDN reference)。前两个参数对于正确使用.reduce()
非常重要:
callback(previousValue, currentValue, index, array)
previousValue
是到目前为止减少的累计值。 currentValue
是正在迭代的数组的下一个元素。如果不需要,不需要使用最后两个参数。
您的代码仅使用previousValue
,因此永远不会查看.reduce()
传入的数组中的下一个项目。
您可以使用.reduce()
像这样制作解决方案:
var flatArray = arrays.reduce(function(previousValue, currentValue) {
return previousValue.concat(currentValue);
}, []);
答案 2 :(得分:1)
Reduce对两个元素执行操作。
var sum = [[1, 2, 3], [4, 5], [6]].reduce(function(a, b) {
return a.concat(b);
}).reduce(function(a, b) {
return a + b;
});