Как передать методы Array.prototype в качестве параметров в карри функции - PullRequest
1 голос
/ 12 апреля 2019

Я начинаю узнавать о функциях карри и подумал, что было бы полезно иметь функцию, которая позволяет мне находить среди групп схожих элементов dom (группы входов или выборок, принадлежащих одному и тому же родителю)те, которые удовлетворяют функции обратного вызова.

Моя цель - получить функцию карри, в которой я могу передать идентификатор (parentId) элемента DOM, который содержит элементы (с классом groupClassName), для которых я хочу запустить callback.Мне удалось заставить работать функцию карри, но я не могу найти способ передать метод array.prototype в качестве параметра.На данный момент метод (будь то метод .filter или .find) жестко закодирован в функциях.Я подумал, что было бы более СУХОЙ, если бы я мог передать это в качестве параметра и иметь только одну функцию карри, где я могу решить, какой метод-прототип использовать.

const filterGroups = parentId => groupClassName => callback => {
  const groups = Array.from(
    document.getElementById(parentId).getElementsByClassName(groupClassName)
  );
  return groups.filter(group => callback(group));
};
const findGroups = parentId => groupClassName => callback => {
  const groups = Array.from(
    document.getElementById(parentId).getElementsByClassName(groupClassName)
  );
  return groups.find(group => callback(group));
};

пример обратного вызова, который я используюбыло бы так:

export function altDateGroupEmpty(group) {
  const selects = Array.from(group.getElementsByTagName("select"));
  return selects.every(select => select.value === "");
}

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

Я очень открыт к различным взглядам на эту ситуацию, так как я только начинаю понимать, как использовать функции с карри в моем коде

1 Ответ

2 голосов
/ 12 апреля 2019

Вы можете взять другой параметр для прототипа и использовать Function#call для вызова прототипа с помощью thisArg.

const perform = parentId => groupClassName => prototype => callback => {
    const groups = Array.from(document.getElementById(parentId).getElementsByClassName(groupClassName));
    return prototype.call(groups, callback);
};

вызов с

perform('foo')('grey')(Array.prototype.filter)(g => true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...