計算機科学のブログ

イテラブル Map ヘルパー関数、キーに基づいてソート、アタイに基づいてソート、キーと値を逆にする

入門JavaScriptプログラミング (JD Isaacks(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT5(イテラブル)、LESSON 25(Map)、25.6(練習問題)、Q25-1の解答を求めてみる。

コード

function sortMapByKeys(map) {
    return new Map(
        [...map.keys()]
            .sort()
            .map(k => [k, map.get(k)])
    );
}
function invertMap(map) {
    return new Map(
        [...map.keys()].map(k => [map.get(k), k])
    );
}
function sortMapByValues(map) {
    return invertMap(
        sortMapByKeys(
            invertMap(map)
        )
    );
}
function p(map) {
    let s = '[';

    for (const kv of map) {
        s += `[${kv}],`;
    }
    s += ']';
    return s;
}

let map1 = new Map(),
    map2 = new Map([[1, 'a']]),
    map3 = new Map([[5, 'a'], [1, 'e'], [4, 'b'], [2, 'd'], [3, 'c']]),
    maps = [map1, map2, map3];

for (const map of maps) {
    console.log(map);
    console.log(`sortMapByKeys: ${p(sortMapByKeys(map))}`);
    console.log(`sortMapByValues: ${p(sortMapByValues(map))}`);
    console.log(`invertMap: ${p(invertMap(map))}`);
    console.log();
}

入出力結果(Terminal、Zsh)

% node sample.js
Map(0) {}
sortMapByKeys: []
sortMapByValues: []
invertMap: []

Map(1) { 1 => 'a' }
sortMapByKeys: [[1,a],]
sortMapByValues: [[1,a],]
invertMap: [[a,1],]

Map(5) { 5 => 'a', 1 => 'e', 4 => 'b', 2 => 'd', 3 => 'c' }
sortMapByKeys: [[1,e],[2,d],[3,c],[4,b],[5,a],]
sortMapByValues: [[5,a],[4,b],[3,c],[2,d],[1,e],]
invertMap: [[a,5],[e,1],[b,4],[d,2],[c,3],]

%