我已经声明了一个名为filter的函数,将数组和回调作为参数,并将偶数传递给新数组。代码可以工作,但它也传入非偶数数字" undefined" (我引用它,而不是字符串)。我究竟做错了什么?
function filter(array, callback) {
var output = [];
for(var i = 0; i < array.length; i++) {
output.push(callback(array[i]));
}
return output;
}
function isEven(elem) {
if (elem % 2 === 0)
return elem;
}
filter([0,1,2,3,4,5,6,7],isEven); -> [ 0,undefined,2,undefined,4,undefined, 6,undefined]
答案 0 :(得分:1)
设计过滤器的方式,当数字不均匀时,函数isEven()
会将undefined
推送到数组中,因为undefined
是JavaScript中函数的默认返回值
基本上,您要求isEven()
获得结果并将其存储在数组中,无论它是否实际为您提供了所需的结果。
JavaScript中有本机函数(请参阅主要帖子评论/其他答案)以帮助您获得相同的结果;但是,如果您想要使用此路由,建议您在将回调结果推入阵列之前检查回调结果。
答案 1 :(得分:0)
Account ac = new Account(Parameters);
Array的过滤函数会向新数组添加元素。所以我写了条件[0,1,2,3,4,5,6,7].filter(function(digit){return digit%2===0})
digit%2 === 0
为true
个数字
答案 2 :(得分:0)
如果您只想要一个过滤器,回调应该只返回一个布尔值:
function filter(array, callback) {
var output = [];
for(var i = 0; i < array.length; i++)
if(callback(array[i]))
output.push(array[i]);
return output;
}
function isEven(elem) {
return elem % 2 === 0;
}
console.log(filter([0,1,2,3,4,5,6,7],isEven));
&#13;
但是如果你想要一些map和filter的混合,只需在将它推送到数组之前检查映射值是否与undefined不同。
function mapFilter(array, callback) {
var output = [];
for(var i = 0; i < array.length; i++) {
var value = callback(array[i]);
if(value !== undefined)
output.push(value);
}
return output;
}
function isEven(elem) {
if (elem % 2 === 0)
return elem;
}
console.log(mapFilter([0,1,2,3,4,5,6,7],isEven));
&#13;
答案 3 :(得分:0)
问题是你的isEven
函数仍然为每个输入元素返回一个数组元素。如果是偶数,则返回输入值,否则返回undefined
(这是默认的返回值)。
也许你的印象是,如果函数没有return
一个值,那么什么都不会被添加到数组中?不是这样!
你需要做这样的事情:
function filter(array, callback) {
var r = [];
for (var i = 0; i < array.length; i++) {
if (callback(array[i])) {
r.push(array[i]);
}
}
return r;
}
function isEven(elem) {
if (elem % 2 === 0)
return elem;
}
filter([0,1,2,3,4,5,6,7],isEven);
但它变得更好。 JavaScript Array
对象有一个内置的filter
方法,它正是这个filter
方法所做的。你只需将你的回调传递给它。
[ 0, 1, 2, 3, 4, 5, 6, 7 ].filter(function (n) {
return n % 2 === 0;
});
此版本仅输出偶数... 0,2,4和6。