點燈坊

失くすものさえない今が強くなるチャンスよ

使用 addIndex() 替 Callback 加上 Index

Sam Xiao's Avatar 2020-08-17

若想在 Array.prototype.map() 的 Callback 得知目前 Element 的 Index,其 Callback 的第二個參數就是 Index,但 Ramda 的 map() 並沒有提供此功能,可使用 addIndex() 加上 Index。

Version

macOS Catalina 10.14.6
Ramda 0.27.0

map()

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = a => a.map((x, i) => `${i}: ${x.title}`)

f(data) // ?

第 7 行

let f = a => a.map((x, i) => `${i}: ${x.title}`)

第二個參數 i 就是 index,可直接使用。

index000

addIndex()

import { map, addIndex } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let mapi = addIndex(map)

let f = mapi((x, i) => `${i}: ${x.title}`)

f(data) // ?

第 9 行

let mapi = addIndex(map)

map() 必須經過 addIndex() 包裝後,其 callback 才有 index 可用。

addIndex()
((a … → b) … → [a] → *) → ((a …, Int, [a] → b) … → [a] → *)
將 callback 加上 index

index001

Conclusion

  • addIndex() 除了可用在 map() 外,也可用在 forEach()

Reference

Ramda, map()
Ramda, addIndex()