2015-07-01 218 views
0

我想更好地理解,並開始用高階函數編碼JS。以下僅僅是一個慣例,我做的,我要輸出數值數組* 2高階函數javascripts

function each(collection, callback) { 
    for(var i = 0; i < collection.length; i++) { 
    callback(collection[i]); 
    } 
} 

function isNumber(item) { 

    var arr = []; 
    if(typeof item === "number") { 
     arr.push(item * 2); 
    } 

    return arr; 
} 

each([1, 2, 3, 4, "String"], isNumber); 

從我的理解,當每個()函數調用時使用數組和ISNUMBER參數,它通過函數運行每。當調用每個函數時,它會調用array [i]的isNumber函數,然後調用該數組[i]的isNumber函數,並且如果數組[i]的類型是數字,它會將該數字* 2推送到陣列。我期待的輸出是

[2, 4, 6, 8] since "String" is not a number it never got pushed into the array. 

我不理解這個嗎?當我嘗試記錄此代碼時,沒有輸出顯示。

+0

每次調用isNumber時,都會將您的數組重新定義爲一個空數組。 –

+0

範圍。你的'var arr'僅限於isNumber函數,因此每次調用'isNumber()'時都會有一個新數組。返回值 - 您看不到由isNumber返回的值。 –

+0

您從不對'isNumber'的結果做任何處理,無論如何都有錯誤的簽名 - 它只有一個要處理的項目,並且應該根據名稱返回true或false。 – user2864740

回答

2

我認爲這會爲你工作:

// Let's call this what it is 
function getNumbersFromArray(collection, callback) { 
    var arr = [], 
     i = 0; 

    for (; i < collection.length; i++) { 
     // Check if isNumber and do mutliplication here 
     if (callback(collection[i])) { 
      arr.push(item * 2); 
     } 
    } 

    return arr; 
} 

// Make isNumber actually return a boolean 
function isNumber(item) { 
    return typeof item === "number"; 
} 

// call console.log() 
console.log(getNumbersFromArray([1, 2, 3, 4, "String"], isNumber)); 
2

沒有輸出顯示,因爲你的函數都沒有返回任何東西。

在這裏,我有你的回調只是採用乘法和返回值,然後推到一個數組中的每個功能

function each(collection, callback) { 
    var arr = []; 
    for(var i = 0; i < collection.length; i++) { 
     var result = callback(collection[i]) 
     if (typeof result !== 'undefined') { 
     arr.push(callback(collection[i])); 
     } 
    } 
    return arr 
} 

function isNumber(item) { 
    if (typeof item === "number") { 
     return item * 2; 
    } 
} 
+0

'isNumber'返回一個非布爾值是有問題的。 – user2864740

+0

它只是OP提供的名稱.. – PhilVarg

+0

我可以編輯它,但是最好的做法是在文章中解決每個問題或者只是讓OP瞭解最初提出的問題?我覺得想要糾正每一個小問題會污染很多答案,它會開始分散注意力從實際問題開始分心 – PhilVarg