高阶函数javascripts

时间:2015-07-01 19:10:58

标签: javascript higher-order-functions

我试图更好地理解并开始使用更高阶函数编写JS。下面只是我正在做的一个练习,我想输出一个数字数组* 2.

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);

从我的理解,当使用array和isNumber参数调用each()函数时,它通过函数运行。当调用每个函数时,它使用array [i]调用isNumber函数,然后调用isNumber函数调用该数组[i],如果数组[i]的类型是数字,则将该数字* 2推送到阵列。我预期的输出是

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

我没有正确理解这个吗?当我尝试记录此代码时,没有输出显示。

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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));