我的代码出现问题:
var arrays = [[1, 2, 3], [4, 5], [6]];
console.log(reduce(arrays,function(array,b){
return array.push(b);
}));
function reduce(array,combine){
var current = [];
for(var i = 0;i<array.length;i += 1){
current = combine(current,array[i]);
}
return current;
}
console.log(reduce([1, 2, 3, 4], function(array, b) {
return array.push(b);
}));
// → [1, 2, 3, 4, 5, 6]
我收到此错误:
TypeError: array.push is not a function (line 3)
据我所知,这是因为它将数组参数视为数组以外的其他参数。但是,我以为我把它变成了变量&#34; current&#34;这是一个数组。有人可以解释这个问题吗?感谢。
答案 0 :(得分:14)
Array.push
没有返回数组。它返回调用它的数组的 new 长度。
因此,您的return array.push(b);
会返回int
。那个int被传递回array
...这不是一个数组,所以它没有.push()
方法。
你需要这样做:
array.push(b);
return array;
答案 1 :(得分:3)
只返回数组,见下文:
http://jsfiddle.net/0en82r7t/1/
var arrays = [[1, 2, 3], [4, 5], [6]];
console.log(reduce(arrays,function(array,b){
array.push(b);
return array;
}));
function reduce(array,combine){
var current = [];
for(var i = 0;i<array.length;i += 1){
current = combine(current,array[i]);
}
return current;
}
console.log(reduce([1, 2, 3, 4], function(array, b) {
array.push(b)
return array;
}));
array.push不返回数组,而是返回新长度
此外,我知道这只是一个测试,但在将来和真正的应用开发中,不要命名Array
数组。使用更详细和清晰的命名,例如:numGroupArray,datesArray,timeArray,tagsArray ......
答案 2 :(得分:3)
此处的问题是<map>
会返回array.push(b)
的新长度。因此,在第一次调用array
后,将返回数组的长度,combine(current, array[i])
变为current
,并且integer
传递给current
在下一次迭代中,JavaScript抛出combine(current, array[i])
。您对TypeError
的实施应如下所示:
combine(current, array[i]
答案 3 :(得分:0)
我不明白函数reduce正在做什么,但问题是Array.prototype.push返回数组的长度。
var array = [1,2,'b'];
var val = array.push('foo');
// val === 4;
因此,不要在循环的每次迭代中重新设置当前,只需简单地调用函数,因为.push()
修改了数组。
function reduce(array,combine){
var current = [];
for(var i = 0;i<array.length;i += 1){
combine(current,array[i]);
}
return current;
}
答案 4 :(得分:0)
看起来您的实施存在问题:
function(array, b) {
return array.push(b);
}
从此函数返回的内容不是数组。
return array.push(b);
执行推送后,返回数组的长度。
因此,您应该将您的功能修改为:
function(array, b) {
array.push(b);
return array;
}
这可能会成功。古德勒克!
答案 5 :(得分:0)
ES6解决方案:
php -d register_argc_argv=On composer.phar