如何将变量值传递给.filter()

时间:2016-12-31 00:39:42

标签: javascript

以下代码来自参考here

function isBigEnough(value) {
      return value >= 10;
    }

    var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
    // filtered is [12, 130, 44]

我想知道是否可以通过传入变量来动态更改10行中return的值。从参考我无法弄清楚如何做到这一点。我想调用相同的过滤器回调,但为正则表达式测试传递一个唯一值。

所以它看起来像:

function isBigEnough(value, num) {
      return value >= num;
    }

4 个答案:

答案 0 :(得分:4)

试试这个

function isBigEnough(num) {
  return function(value) {
    return value >= num;
  }
}

然后

[12, 5, 8, 130, 44].filter(isBigEnough(10));

这是如何运作的?

  • 调用isBigEnough(10)会返回匿名函数
  • 然后将匿名函数传递给过滤器

答案 1 :(得分:4)

最简单的方法是使用匿名函数并关闭要使用的变量:

var minSize = 10;
var filtered = [12, 5, 8, 130, 44].filter( val => val >= minSize );

如果你真的想保留一个命名函数来回调,你可以用bind部分地应用一个参数:

function isBigEnough(minSize, value) {
  return value >= minSize;
}

var filtered = [12, 5, 8, 130, 44].filter(isBigEnough.bind(null,10));

这里,bind将返回一个新函数,最左边的参数绑定到10(第一个参数,一个为null,是被调用时作为this传递给函数的函数)。因此,过滤器传入的参数将显示为回调中的第二个值。

答案 2 :(得分:2)

这应该有效。第二个参数(在这种情况下为10)将作为this传递。

function isBigEnough(value) {
    return value >= this;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough, 10);

答案 3 :(得分:0)

这个(更通用的)方法怎么样:

//argument order is chosen to be consistent through all functions, and readability when used:
var op = { //for operator
    eq: b => a => a === b,  //equal
    neq: b => a => a !== b, //not equal,
    gt: b => a => a > b,    //greater than
    lt: b => a => a < b,    //lower than
    gteq: b => a => a >= b,
    lteq: b => a => a <= b,

    //bonus, negating a function:
    not: fn => (...args) => !fn(...args) //to be used as `arr.filter( op.not(filterFn) )`
}

这些快捷方式对于这些操作符来说很常见,除此之外我认为生成的代码非常易读且可以自我解释

var filtered = [12, 5, 8, 130, 44].filter( op.gteq(10) );

//or:

//defining how to validate thew values
var isBigEnough = op.gteq(10);

//...

//the rest of the code only utilizes this function -> only 1 place to change
var filtered = [12, 5, 8, 130, 44].filter( isBigEnough );