Ответ Скотта Кристофера, безусловно, правильный. zipWith
предназначен именно для такого сценария. В своем заголовке вы спрашиваете, как это сделать во время картирования. Я хотел бы отметить, что, хотя Рамда действительно предлагает вариант для этого (подробности см. addIndex
), он, как правило, осуждается. Причина этого важна для получения дополнительной информации о FP.
Одно понимание map
состоит в том, что он преобразует список элементов одного типа в список элементов другого типа посредством применения данной функции к каждому элементу. Это хорошая формулировка, но есть более общая формулировка: map
преобразует контейнер элементов одного типа в контейнер элементов другого типа посредством применения данная функция для каждого элемента. Другими словами, понятие mapping
может применяться ко многим различным контейнерам, а не только к спискам. Спецификация FantatsyLand определяет некоторые правила для контейнеров, которые имеют методы map
. Конкретный тип - Functor
, но для тех, у кого нет соответствующего математического фона, это можно рассматривать как Mappable
. Рамда должен хорошо взаимодействовать с такими типами:
const square = n => n * n;
map(square, [1, 2, 3, 4, 5]) //=> [1, 4, 9, 16, 25]
// But also, if MyContainer is a Functor
map(square, MyContainer(7)) //=> MyContainer(49)
// and, for example, if for some Maybe Functor with Just and Nothing subtypes
const {Just, Nothing} = {Maybe}
// then
map(square, Just(6)) //=> Just(36)
map(square, Nothing()) //=> Nothing()
Функция Рамды map
вызывает предоставленную функцию преобразования только с элементом контейнера. Он не предоставляет индекс. Это имеет смысл, поскольку не все контейнеры имеют какое-либо представление об индексах.
Из-за этого картирование - это то, что Рамда не место для попыток сопоставить индексы. Но это в основе трех zip функций Рамды . Если вы хотите объединить два списка, элементы которых сопоставляются по индексу, вы можете сделать это наиболее просто, как Скотт сделал с zipWith
. Но вы также можете использовать zip
, который работает так:
zip(['a', 'b', 'c', 'd'], [2, 3, 5, 7]) //=> [['a', 2], ['b', 3], ['c', 5], ['d', 7]]
с последующим вызовом map
по полученным парам. zipWith
просто позволяет вам сделать то же самое за один шаг. Но без этого примитивы, такие как map
и zip
, все еще можно комбинировать, чтобы делать то, что вам нравится.