Javascript: 为什么数组变量赋值在这个函数内外表现不同?
Javascript: Why array variable assignment is behaving differently inside and outside this function?
对于我的生活,我就是想不通我在这里做错了什么。
我正在尝试同时使用 reduce 和 concat 数组方法来获取二维数组的所有值并将它们组合成一个值(基本上将它们压缩成一个数组然后将它们相加)。
我保留 运行 的问题是,当我尝试创建一个 for/loop 来连接每个数组元素时,我传递给函数的参数没有被识别为一个数组,因此我对 .concat() 的调用失败了。我在函数的开头放置了一个 console.log() 以查看该元素是否被识别为二维数组中的第一个数组元素,并且它以“1”(?)出现。
我在函数之外尝试了另一个测试,它记录为实际的数组元素。我在这里做错了什么?代码如下:
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
在函数内部时,数组似乎正在被转换为数字类型...?
您使用 .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);
}, []);
您的代码有误:
var flatArray = arrays.reduce(function(param) {})
该参数将是您的数组向量的一个元素。
勾选这个https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
Reduce 对两个元素执行操作。
var sum = [[1, 2, 3], [4, 5], [6]].reduce(function(a, b) {
return a.concat(b);
}).reduce(function(a, b) {
return a + b;
});
对于我的生活,我就是想不通我在这里做错了什么。
我正在尝试同时使用 reduce 和 concat 数组方法来获取二维数组的所有值并将它们组合成一个值(基本上将它们压缩成一个数组然后将它们相加)。
我保留 运行 的问题是,当我尝试创建一个 for/loop 来连接每个数组元素时,我传递给函数的参数没有被识别为一个数组,因此我对 .concat() 的调用失败了。我在函数的开头放置了一个 console.log() 以查看该元素是否被识别为二维数组中的第一个数组元素,并且它以“1”(?)出现。
我在函数之外尝试了另一个测试,它记录为实际的数组元素。我在这里做错了什么?代码如下:
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
在函数内部时,数组似乎正在被转换为数字类型...?
您使用 .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);
}, []);
您的代码有误:
var flatArray = arrays.reduce(function(param) {})
该参数将是您的数组向量的一个元素。
勾选这个https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
Reduce 对两个元素执行操作。
var sum = [[1, 2, 3], [4, 5], [6]].reduce(function(a, b) {
return a.concat(b);
}).reduce(function(a, b) {
return a + b;
});