首页 > 解决方案 > 使用闭包进行多重选择的数组过滤器函数 - Javascript

问题描述

我需要为过滤器创建一个函数,它必须有 2 个选择。

  1. inBetween(a, b)a- 这将返回和之间的数组b
  2. inArray([...])- 这将返回与过滤数组匹配的项目数组。

像这样的东西:

let arr = [1, 2, 3, 4, 5, 6, 7];

console.log( arr.filter(f(inBetween(3, 6))) ); // 3,4,5,6
console.log( arr.filter(f(inArray([1, 2, 10]))) ); // 1,2

我试过这个功能:

function f(item) {
  let result = [];

  function inBetween(from, to){
    if (item >= from && item <= to){
      result.push(item);
    }
  }

  function inArray(array){
    if (array.indexOf(item) >= 0){
      result.push(item);
    }
  }

  return result;
}

但我不知道如何将我的功能附加到filter. 它给出了这个错误:

console.log(arr.filter(f(inBetween(3, 6)))); // 3,4,5,6

ReferenceError: inBetween 未定义

有可能吗?

标签: javascriptarraysfilterclosures

解决方案


array.filter()需要一个函数。如果要预先绑定一些参数,则需要一个返回函数的函数。在这种情况下,两者都inBetween应该inArray返回函数。

所以应该是:

let arr = [1, 2, 3, 4, 5, 6, 7];

function inBetween(min, max) {
  return function(value) {
    // When this is called by array.filter(), it can use min and max.
    return min <= value && value <= max
  }
}

function inArray(array) {
  return function(value) {
    // When this is called by array.filter(), it can use array.
    return array.includes(value)
  }
}

console.log( arr.filter(inBetween(3, 6)) )
console.log( arr.filter(inArray([1, 2, 10])) )

在这种情况下,minmaxarrayclose 覆盖返回的函数,以便在array.filter()调用返回的函数时,它可以访问这些值。


您的inArray()功能已经由 native 实现array.includes()


推荐阅读