ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

Учебник по JavaScript: ч.1, функции-переходники

Начало тут:
1. Учебник по JavaScript: ч.1, параметры и замыкания
2. Учебник по JavaScript: ч.1, замыкания и циклы

Понравилась задача «Фильтрация с помощью функции» к подразделу 6.3 «Замыкание» учебника.

Для массивов в языке JavaScript есть встроенный метод arr.filter(f), который возвращает массив, полученный из исходного массива arr фильтрацией с помощью функции f.

Функция f получает от метода filter от одного до трех параметров: item (значение текущего элемента), index (индекс текущего элемента), array (массив, по которому осуществляется проход). Обработав их, функция f должна возвратить значение true для тех элементов, которые должны попасть в итоговый массив с отфильтрованными элементами.

В задаче предлагается сделать возможными следующие вызовы встроенного метода фильтрации массива:

let arr = [1, 2, 3, 4, 5, 6, 7];          // исходный массив

alert( arr.filter(inBetween(3, 6)) );     // массив-результат: [3, 4, 5, 6]

alert( arr.filter(inArray([1, 2, 10])) ); // массив-результат: [1, 2]

Тут во встроенный метод фильтрации массива передаются функции inBetween и inArray со своими дополнительными параметрами (в случае функции inBetween встроенный метод фильтрации массива должен вернуть массив с теми элементами исходного массива, значения которых находятся в пределах, заданных параметрами функции inBetween; в случае функции inArray встроенный метод фильтрации массива должен вернуть массив с теми элементами исходного массива, которые входят в массив-параметр функции inArray).

Проблема в том, что функции inBetween и inArray не подпадают под условия, которым должна удовлетворять фильтрующая функция f: их параметры не являются параметрами item (значение текущего элемента), index (индекс текущего элемента), array (массив, по которому осуществляется проход).

Как решить эту задачу? Нужно написать функции inBetween и inArray, которые внутри себя будут конструировать фильтрующую функцию нужного вида и возвращать ее. Пример решения:

function inBetween(from, to) {
    return function (item, index, array) {
        if (item < from || item > to) {
            return false;
        }
        return true;
    };
}

function inArray(ar) {
    return function (item, index, array) {
        return ar.includes(item);
    };
}

Функции inBetween и inArray можно назвать функциями-переходниками (или функциями-адаптерами), так как они преобразуют функцию с одним набором параметров в функцию с другим набором параметров.

Эта задача напомнила мне про функциональные адаптеры bind1st, bind2nd, std::bind в языке C++, о которых я писал тут:
C++: чем отличаются bind1st и bind2nd
Tags: Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments