點燈坊

學而時習之,不亦悅乎

使用 adjust() 改變 Array 中指定 index 值

Sam Xiao's Avatar 2019-12-03

若要改變 Array 中指定 Index 值,Ramda 提供了 adjust(),可自行傳入 Index 與 Function 改變之。

Version

macOS Catalina 10.15.1
VS Code 1.40.2
Quokka 1.0.261
Ramda 0.26.1

Imperative

let data = [1, 2, 3]

let adjust = idx => fn => arr => {
  let result = []

  for(let i = 0; i < arr.length; i++) {
    if (i === idx) 
      result.push(fn(arr[i]))  
    else 
      result.push(arr[i])
  }

  return result
}

let double = x => x * 2

adjust(1)(double)(data) // ?
adjust(4)(double)(data) // ?

若想改變 array 中特定 index 值,且提供 function 改變,imperative 會使用 for loop 判斷 index 值,經過傳入 function 運算 push 進 result,其他則維持原本 element,最後 result array 回傳。

adjust000

Array.prototype.reduce()

let data = [1, 2, 3]

let adjust = idx => fn => arr => 
  arr.reduce((a, x, i) => [...a, (i == idx) ? fn(x): x], [])

let double = x => x * 2

adjust(1)(double)(data) // ?
adjust(4)(double)(data) // ?

由於回傳為單一 array,亦可使用 Array.prototype.reduce() 實現。

adjust001

Ramda

import { adjust } from 'ramda'

let data = [1, 2, 3]

let double = x => x * 2

adjust(1)(double)(data) // ?
adjust(4)(double)(data) // ?

Ramda 已經提供 adjust(),可直接使用。

adjust()
Number → (a → a) → [a] → [a]

使用 function 改變 array 中指定 index 值

Number:指定 index 值

(a -> a):改變 index 的 function

[a]:data 為 array

[a]:回傳改變過 array

adjust002

Conclusion

  • adjust()update() 很類似,唯 adjust() 傳入 function,而 update() 傳入 value

Reference

Ramda, adjust()