2014-01-05 72 views
0

我製作了一個通用函數filter(arr, func),它將使用給定函數作爲參數的數組進行過濾。只有那些func(elem)返回true的元素才能組成一個新數組。boolean返回0或1與其他函數發生衝突

問題是如果數組項目小於10,則low function返回true,如果數組項目是布爾值,則​​返回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

用typeof ...即進行比較時,你應該使用三個===如果(typeof運算myVar的=== 「未定義」) {...} –

+0

'val <10'將始終爲「true」或「false」,而不是「1」或「0」。 –

回答

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/並使用「===」檢查而不是「==」,以便將值與實際類型進行比較而不進行轉換。

還要注意你的函數,例如布爾將任何其他值返回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; 
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