2021年2月第2週レポート
インプット
仕事の山を超えられそうなので翌週からはインプットの量を増やしたい
📝 TypeScriptでもGroupByしたい
ある一つ配列を特定のルールに基づいて分割し新しい配列(のコレクション)を作りたくなることがあります。C#なんかだとLINQのGroupByを使ったりするのですが、TypeScript/JavaScriptだとunderscore.jsを使えば実現できるみたい。ただ、GroupByだけのためにパッケージを追加するのもちょっと気が引けたのでバニラで実装しました。
export function groupBy<K, V>(
array: readonly V[],
getKey: (current: V, index: number, src: readonly V[]) => K): Map<K, V[]> {
return array.reduce((map, current, index, srcArray) => {
const key = getKey(current, index, srcArray)
const list = map.get(key)
if (list) list.push(current)
else map.set(key, [current])
return map
}, new Map<K, V[]>())
}
以下のQiita記事のものとほぼ同様です。
こういったライブラリライクなコードはアプリケーションコードとは違った設計が求められ、特にTypeScript場合では型定義の妙技が求められるのでTypeScript製の有名どころなオープンソースを一本読み込んでみたいですね。
📝 配列から重複を除きたいときはSetを使おう
またまた配列ネタ。
「JavaScript 配列 重複 削除」と検索すると、filter
とindexOf
を使って各要素のインデックスとindexOf
でヒットしたインデックスが一致しなければ除外、みたいなコードを見かけたりします。もちろん配列の重複を削除するという目的は達成できますが、indexOf
はサーチが発生するのでO(n)
の計算量で、filter
もO(n)
なので全体としてO(n^2)
のオーダーとなり、あまりスピードが出ないです。
ES6以降に導入されたSet
を使えばもっと高速化できるのでそちらを使いましょう、という話です。
const numArray1 = [1,2,3,2,7,9,1,2,3,4,7,9]
const numArray2 = [...new Set(numArray1)]
console.log(numArray2) // [ 1, 2, 3, 7, 9, 4 ]
こちらはnumber
やstring
といったプリミティブ型限定なので、オブジェクトが対象となるとまた別の対応が必要ですね。
アウトプット
🛠️ RustでNESエミュレータを作っている
休日にちょっと時間をとって何とか少し進捗を出そうとしている状態。
先週と変わらずnestestを使ってCPUの改修を行っているのですが、どうやらADC命令やSBC命令の実行時のオーバーフロー判定に問題がある模様。
こちらで少し解説されているサインドオーバーフローの理解がちょっと弱いと思われる。