點燈坊

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

使用 insertAll() 將 Array 新增至指定 Index 的 Array

Sam Xiao's Avatar 2020-02-01

若要將多個值新增至 Array 中指定 Index,原本 Element 全部往後移,Ramda 提供了 insertAll()

Version

macOS Catalina 10.15.2
VS Code 1.41.1
Quokka 1.0.276
Ramda 0.26.1

Imperative

let data = [0, 4, 5]

let insertAll = idx => vals => arr => {
  let result = []

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

  return result
}

insertAll(1)([1, 2, 3])(data) // ?

Imperative 會藉由 for loop 判斷 index,藉由 ES6 的 ... array spread 可輕易將指定 vals array 插入原 array。

insertall000

reduce()

let data = [0, 4, 5]

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

insertAll(1)([1, 2, 3])(data) // ?

既然能使用 for loop 實現,也能使用 reduce() 改寫。

別忘了 reduce() 的第三個 parameter 為 index,因此可用來判斷指定 index。

insertall001

Ramda

import { insertAll } from 'ramda'

let data = [0, 4, 5]

insertAll(1)([1, 2, 3])(data) // ?

Ramda 提供了 insertAll() 可直接使用。

insertAll()
Number → [a] → [a] → [a]
將 array 新增至指定 index 的 array

Number:指定 index

[a]:要新增的 array

[a]:data 為 array

[a]:回傳新 array

insertall002

Conclusion

  • insertAll()insert() 類似,唯 insertAll() 是新增 array,而 insert() 是新增單一值

Reference

Ramda, insertAll()