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使っていこうと思います
簡単ですが、以上です
この記事が気に入ったらサポートをしてみませんか?