Функция фильтра массива с множественным выбором с использованием замыкания - Javascript - PullRequest
4 голосов
/ 28 сентября 2019

Мне нужно создать функцию для фильтра, и она должна иметь 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 не определено

Возможно ли это как-то?

1 Ответ

9 голосов
/ 28 сентября 2019

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

В этом случае min, max и array закрывают возвращаемую функцию, так что когда array.filter() вызывает возвращенную функцию, она имеет доступк этим значениям.


Ваша функциональность inArray() уже реализована встроенной array.includes().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...