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記事のものとほぼ同様です。

JavaScript/TypeScript で配列の groupBy - Qiita

こういったライブラリライクなコードはアプリケーションコードとは違った設計が求められ、特にTypeScript場合では型定義の妙技が求められるのでTypeScript製の有名どころなオープンソースを一本読み込んでみたいですね。

📝 配列から重複を除きたいときはSetを使おう

またまた配列ネタ。

「JavaScript 配列 重複 削除」と検索すると、filterindexOfを使って各要素のインデックスとindexOfでヒットしたインデックスが一致しなければ除外、みたいなコードを見かけたりします。もちろん配列の重複を削除するという目的は達成できますが、indexOfはサーチが発生するのでO(n)の計算量で、filterO(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 ]

こちらはnumberstringといったプリミティブ型限定なので、オブジェクトが対象となるとまた別の対応が必要ですね。

アウトプット

🛠️ RustでNESエミュレータを作っている

休日にちょっと時間をとって何とか少し進捗を出そうとしている状態。

先週と変わらずnestestを使ってCPUの改修を行っているのですが、どうやらADC命令やSBC命令の実行時のオーバーフロー判定に問題がある模様。

こちらで少し解説されているサインドオーバーフローの理解がちょっと弱いと思われる。

Profile
d_yama
元Microsoft MVP for Windows Development(2018-2020)
Sub-category : Windows Mixed Reality
Search