@beem7

Как сделать функцию, способную обрабатывать заданный «кусок» массива или любого другого контейнера?

Передаешь в функцию массив\немассив и информацию о том, какой именно его "кусок" надо обработать (то есть сделать с каждым элементом некое действие).
И она в цикле обрабатывает.

Собственно, для массива это очень даже просто:
function fun(arr, start, end) {
// и внутри цикл, который идет от start к end по массиву и делает действие
// а если start больше end, то то же самое, но в обратном порядке
}


Но что, если у нас не массив, а List из Immutable.js? А если Set? А если Map? А если вообще object?
Вот нужно, чтобы одна и та же функция могла с ними всеми работать, то есть как-то так:
function fun(container, range, get) {
}

где:
container - это контейнер любого типа;
range - это некий формат, в котором опять же будет задан интервал (от, до и направление);
get - это функция, которая позволяет из каждого элемента контейнера получить те значения, которые нужны для функции. Для массива нужен один get, для List нужен другой get и т.д.

А что именно должен собой представлять range?
Подумал и пришел к тому, что это должен быть iterable.
Ведь, в принципе, любой уважающий себя контейнер уже является iterable, поэтому может быть просто передан напрямую, если требуется пройти по всему контейнеру и именно в "обычном" (не обратном) порядке.
А если надо пройти лишь по какому-то интервалу контейнера, то пользователь может сделать свой iterable (например, сделав генератор), передать его и опять же все получится.

Но... делать свой iterable - это довольно сложно и громоздко.
Даже для интервала обычного массива потребуется написать строчек 5-10.
И я не нашел ни одной библиотеки, где бы был метод вроде makeArrayIterable(array, start, end, direction), чтобы делать это в одну строку.
Отсюда закрались сомнения - а правильно ли я вообще решаю задачу, или это делается как-то проще?
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
а правильно ли я вообще решаю задачу
Конечно же, нет.
Эта задача решается плагинами-обёртками-адаптерами, которые на вход получают данные в каком-то одном формате, преобразуют его в другой, внутренний формат вашей библиотеки, который тоже один и дальше она работает только с ним, а потом отдаёт результат адаптеру для переконвертации.

Контракт адаптера жёстко зафиксирован и довольно мал, поэтому любителям странного легко сделать свой под свой уникальный формат. А для небольшого количества возможных адекватных форматов вы можете написать плагины сразу.

Вы не нашли ни одной библиотеки по двум причинам:
1. Описанное вами поведение абсолютно некорректно с точки зрения некоторых указанных структур данных и стандарта языка. У объектов, сетов, мапов и т.д. нет никакого range. То, что это можно закостылить не означает, что это стоит делать.
2. В реальном мире, а не в розовых фантазиях оверинжиниринга и перепридумывания всего и вся, потому что все, кто были в индустрии до вас, дураки, таких задач просто не стоит, потому что см. пункт 1.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы