Node.jsとの闘いpart2

おはようございます、昨日の続きです

<余談>いきなり余談なんですが、そういえば昔ホテルで配膳のバイトしてる時があって、先輩に挨拶するときはどんな時間帯でも必ずおはようございますという文化があったを思い出しました</余談>

不明点

Mapとpairとmap関数とArrayとsortと…

'use strict';
const fs = require('fs');
const readline = require('readline');
const rs = fs.ReadStream('./popu-pref.csv');
const rl = readline.createInterface({ 'input': rs, 'output': {} });

###マップ(map関数とは異なる)というオブジェクトの作成(まだkeyにもvalueにも値は入っていない)
const map = new Map(); // key: 都道府県 value: 集計データのオブジェクト

rl.on('line', (lineString) => {
const columns = lineString.split(',');
const year = parseInt(columns[0]);
const prefecture = columns[2];
const popu = parseInt(columns[7]);
if (year === 2010 || year === 2015) {

###マップにはまだなんも値が入っていないので、prefectureを入れてもvalueはundefinedとなり、falseな値である。強制的にvalueに、popu10,popu15,changeに以下の値が代入される(ちなみにvalue={popu10:X, popu15:X, change:X}みたいなlist形式(?)の値です)
let value = map.get(prefecture);
if (!value) {
value = {
popu10: 0,
popu15: 0,
change: null
};
}

###もし2010ならvalueのpopu10にpopuが加えられて、もし2015ならpopu15に加えられるコマンド
if (year === 2010) {
value.popu10 += popu;
}
if (year === 2015) {
value.popu15 += popu;
}
map.set(prefecture, value);
}
});

###'close'というイベント(=全ての行が読み込み終わる)が生じたとき() => {}の関数を実行(今回は特に引数は存在しない)
rl.on('close', () => {

###let pair of mapは、今回のmapの構成[キー:値]という構成をpairに代入してくれるコマンド、つまりpair[1]はvauleを表すことがわかる。pairはmapの一単位を表すと考えよう。これをvalueというオブジェクトという定数でおいて(さっきまでのvalueは変数だった)、valueのプロパティを計算させて結果的に生じるmapを表示させている
for (let pair of map) {
const value = pair[1];
value.change = value.popu15 / value.popu10;
}

###Array.from(map)で、連想配列を普通の配列に、arrayのsort関数で順番を並び替える。
順番の並び替え方は、
1.まず引数を二つA,Bと指定する。
2.AB順に並び替えたいときは、{}内の関数の結果がを負になるように書き、BA順に並び替えたいときは{}内の整数が正になるようにかく
const rankingArray = Array.from(map).sort((pair1, pair2) => {
return pair2[1].change - pair1[1].change;
});

###rankingArrayのpair一つ一つに対して、下記のコマンドを行う(ちなみに今rankingArrayの形は{1, pair}={1, key, value}={1, key, popu10, popu15, change})みたいになっていてクッソ複雑です
const rankingStrings = rankingArray.map((pair) => {
return pair[0] + ': ' + pair[1].popu10 + '=>' + pair[1].popu15 + ' 変化率:' + pair[1].change;
});
});

こんな感じになっている、重要なことはドットつなぎになっているのは、そのオブジェクトのプロパティを呼び出して代入しているということ。例えばvalue.change = AだったらvalueのchangeというプロパティにAという値を代入しているということである。

こんなん無限に脳みそ使うしやばいなぁ