2015-07-01 167 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