我创建了一个泛型函数filter(arr, func)
,它使用给定函数作为参数过滤数组。只有那些func(elem)
返回true的元素才能组成一个新数组。
问题是如果数组项小于10,则low function
返回true,如果数组项是布尔值,则bool function
返回true。由于布尔值在javascript中返回1或0,这与我的low function
冲突。
他们是否可以停止返回数字的布尔值?或以某种方式保持布尔结果超出low function
var array = [4, 8, 'bob', true, 'stink', 55, false, 'pepo', 11];
function low(val) {
return val < 10;
}
function word(str) {
if(typeof str == 'string')
return true;
}
function bool(b) {
if (typeof b == 'boolean')
return true;
}
function filter(arr, func) {
var newArr = [];
for(var i = arr.length; i >= 0; i--) {
var result = func(arr[i]);
if(result == true) {
newArr.push(arr[i]);
}
}
return newArr;
}
alert(filter(array, low));
答案 0 :(得分:1)
他们是否可以停止返回数字的布尔值?或者以某种方式将布尔结果保留在
之外low
函数
在数字上下文中评估的布尔值(例如true < 10
)被隐式强制转换为数字,其数值为:
Number(true) === 1
Number(false) === 0
所以true < 10
评估为1 < 10
,这是真的。
在进行比较之前,您可以检查传递的参数是否为数字:
function low(val) {
return typeof val == 'number' && val < 10;
}
我还会注意到ES5有一个内置的Array#filter
方法,可以让您的生活更轻松:
var filteredArray = array.filter(low).reverse();
//reverse() because of the inverse iteration in your original filter function
答案 1 :(得分:0)
这是一种方法:
var array = [4, 8, 'bob', true, 'stink', 55, false, 'pepo', 11];
function low(val) {
return bool(val) === false ? val < 10 : false;
}
function word(str) {
return typeof str === 'string' ? true : false;
}
function bool(b) {
return typeof b === 'boolean' ? true : false;
}
function filter(arr, func) {
var newArr = [];
for(var i = arr.length; i >= 0; i--) {
var result = func(arr[i]);
if(result === true) {
newArr.push(arr[i]);
}
}
return newArr;
}
alert(filter(array, low));
添加了代码以便:http://jsfiddle.net/3AS4d/并使用“===”检查而不是“==”,因此值将与实际类型进行比较而不进行转换。
另请注意,您的函数(如bool)将在布尔值上返回true
,但在任何其他值上返回undefined
:
function bool(b) {
if (typeof b === 'boolean')
return true;
}
bool(true); // true
bool("haa"); // undefined
这就是我推荐这些方法的原因,如:
function bool(b) {
if (typeof b === 'boolean')
return true;
return false; // important
}
或者我喜欢用单行符号来表达这些:
some condition ? true : false;
这里的例子:
function bool(b) {
return typeof b === 'boolean' ? true : false;
}
或分配给变量:
var myVar = 1000 > 0 ? 1 : 0; // will result myVar to be 1;