正确地传递新值,但也将undefined传递给new数组
passing new values correctly but also passing undefined into new array
我声明了一个名为filter的函数,将数组和回调作为参数,并只将偶数传递给新数组。代码可以工作,但它也将非偶数传递为"未定义"(我引用它,不是字符串)。我做错了什么?
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]
过滤器的设计方式是,当一个数字不是偶数时,函数isEven()
将把undefined
推入数组,因为undefined
是JavaScript函数的默认返回值。
基本上,您要求isEven()
获得结果并将其存储在数组中,无论它是否实际上给了您所需的结果。
JavaScript中有原生函数(参见您的主要帖子评论/其他答案)来帮助您实现相同的结果;然而,如果你想走这条路,建议你在把回调的结果推入数组之前检查一下。
如果你只想要一个过滤器,回调应该只返回一个布尔值:
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));
但是如果你想混合使用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));
[0,1,2,3,4,5,6,7].filter(function(digit){return digit%2===0})
filter函数如果返回true,则向新数组添加元素。所以我写了条件digit%2 === 0
也就是true
对于even
的数字
问题是您的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
- JSON数组数据返回Undefined
- 试图打印/调用/或提醒数组中的对象:Getting Undefined
- 在数组中循环,jQuery返回undefined
- 为什么 array.indexOf(undefined) 在数组稀疏的情况下不起作用
- .push() 多个对象进入 JavaScript 数组返回 'undefined'
- Javascript 数组:将条目设置为 undefined
- Javascript数组.将计算值推送到数组会返回undefined
- 在JSON中POST一个js::数组,得到"undefined:undefined”;
- grep在尝试访问数组中的对象时返回undefined
- jQuery DataTables() 返回空数组,destroy() 不能在 undefined 上调用
- 带有对象数组的Javascript;Object中的属性具有Value,返回Undefined
- 从数组中移除Item会在object的位置留下undefined
- 将json推送到数组返回undefined
- Service在angularjs中的数组中返回undefined
- 数组中.如果最后一个元素在javascript中未定义,则Length返回undefined
- 数组中重复的值会导致出现undefined
- jQuery多维数组(动态键)-不能设置属性undefined
- 对getElementsByClassName中的数组使用forEach会导致“TypeError: undefined
- 从追加的数组返回Undefined
- Javascript二维数组在打印其他数组之前给出undefined