見出し画像

lfiライブラリを用いたMapのValueにSetを持たせた構造化手法

ハンディそうなlfiライブラリを用いたMapのValueにSetを持たせた構造化手法の紹介です。


公式のサンプルは型付けを明示しないと型エラーが出ます。

import {
  filter,
  map,
  pipe,
  reduce,
  toArray,
  toGrouped,
  toMap,
  toSet,
} from 'lfi'

const messySlothDiaryEntries: [string, string][] = [
  [`Carl`, `slept`],
  [`phil`, `ate  `],
  [`phil`, ``],
  [`CARL`, `climbed`],
  [`Frank`, `ate`],
  [`frank`, `strolled`],
  [`carl`, `Slept`],
  [`Frank`, `  `],
]

const cleanSlothDiaryEntries: [string, string][] = pipe(
  messySlothDiaryEntries,
  map(([sloth, activity]) => [sloth, activity.trim()]),
  filter(([, activity]) => activity.length > 0),
  map(([sloth, activity]): [string, string] => [sloth.toLowerCase(), activity.toLowerCase()]),
  reduce(toArray()),
)
console.log(cleanSlothDiaryEntries)
//=> [ [ 'carl', 'slept' ], [ 'phil', 'ate' ], [ 'carl', 'climbed' ], ... ]

const uniqueActiviesPerSloth = reduce<[string, string], never, Map<string, Set<string>>, unknown>(
  toGrouped(toSet(), toMap()),
  cleanSlothDiaryEntries,
)
console.log(uniqueActiviesPerSloth)
//=> Map(3) {
//=>   'carl' => Set(2) { 'slept', 'climbed' },
//=>   'phil' => Set(1) { 'ate' },
//=>   'frank' => Set(2) { 'ate', 'strolled' }
//=> }

特にGroupedからMapのValueにSetを持たせる流し込みがきれいです

Collection系の操作になりますね

const uniqueActiviesPerSloth = reduce<[string, string], never, Map<string, Set<string>>, unknown>(
  toGrouped(toSet(), toMap()),
  cleanSlothDiaryEntries,
)


このようなライブラリを見たときに、複数列への拡張を検討してみるとtidyjsがやはり軍配あがるなといった印象です


tidyjs使っていこうと思います

簡単ですが、以上です

この記事が気に入ったらサポートをしてみませんか?