點燈坊

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

使用 flatMap() 取出 Array 中所有 Combination

Sam Xiao's Avatar 2020-10-30

若我們想找出 Array 中所有 Combination,可使用 flatMap()slice() 實現。

Version

ECMAScript 2020

Array.prototype.map()

let data = [1, 2, 3] 

let f = a => a.map(
  (x, i) => a.slice(i+1).map(y => [x, y])
)

f(data) // ?
  • 使用 map() 產生每個 item 與其 index
  • 使用 slice() 對每個 item 產生其 sub-array
  • 使用 map() 產生 pair 回傳

all000

雖然取出所有 combination,但為 nested array。

Array.prototype.flatMap()

let data = [1, 2, 3] 

let f = a => a.flatMap(
  (x, i) => a.slice(i+1).map(y => [x, y])
)

f(data) // ?
  • 使用 flatMap() 讓 nested array 只剩下一層

all001

Conclusion

  • 實務上若有若有兩層 loop 需求會寫出兩層 map(),因而產生 nested array,可將外層直接使用 flatMap() 攤平

Reference

MDN, flatMap()
MDN, slice()