「ロナえる」の夫です。
配列内の同一要素をカウントしたいことありますよね。
例えば、アンケートで取ったデータの集計するとき。
次のような表から、
年齢 | 性別 | インドア派/アウトドア派 |
---|---|---|
30代 | 男 | インドア派 |
20代 | 男 | アウトドア派 |
30代 | 女 | インドア派 |
40代 | 女 | アウトドア派 |
40代 | 女 | アウトドア派 |
年齢 20代:1人、30代:2人、40代:2人
性別 男:1人、女:3人
インドア派:2人、アウトドア派:3人
みたいな集計を簡単に計算できます。
今回は、reduce
を使って選択肢のカウントを行います。
reduceとは?
reduce
は、配列の要素を使ったfor文で値を引き回した処理をしたい時に便利なメソッドです。
詳しくはこちらで、reduce
をもう少し詳しく記載してます。
-
【Javascript】Array(配列)の使い方をまとめました
続きを見る
配列内の同一要素を集計(カウント)する
冒頭で出てきた表で、年齢を集計してみましょう。
まずはfor文で記述してみます。
let array = [
{年齢: "30代", 性別 : "男", 思考: "インドア派"},
{年齢: "20代", 性別 : "男", 思考: "アウトドア派"},
{年齢: "30代", 性別 : "女", 思考: "インドア派"},
{年齢: "40代", 性別 : "女", 思考: "アウトドア派"},
{年齢: "40代", 性別 : "女", 思考: "アウトドア派"},
];
const func = (sum, val) => {
if( val["年齢"] in sum ) {
sum[val["年齢"]]++;
}else {
sum[val["年齢"]] = 1;
}
return sum;
}
let sum = {};
for( let i = 0; i < array.length; i++ ) {
sum = func( sum, val );
}
// sum = { 30代: 2, 20代: 1, 40代: 2 }
sum[array[i]["年齢"]]++;
こういうところが若干読みにくく感じます。
これをreduce
を使って書くと、
let array = [
{年齢: "30代", 性別 : "男", 思考: "インドア派"},
{年齢: "20代", 性別 : "男", 思考: "アウトドア派"},
{年齢: "30代", 性別 : "女", 思考: "インドア派"},
{年齢: "40代", 性別 : "女", 思考: "アウトドア派"},
{年齢: "40代", 性別 : "女", 思考: "アウトドア派"},
];
const func = (sum, val) => {
if( val["年齢"] in sum ) {
sum["年齢"]++;
}else {
sum["年齢"] = 1;
}
return sum;
}
const output = array.reduce( func, {});
// output = { 30代: 2, 20代: 1, 40代: 2 }
こうすると、少しスッキリした気がします!
また、今回は年齢をハードコードで記載していますが、もうひと工夫をすると集計ターゲットを可変にすることができます。
let array = [
{年齢: "30代", 性別 : "男", 思考: "インドア派"},
{年齢: "20代", 性別 : "男", 思考: "アウトドア派"},
{年齢: "30代", 性別 : "女", 思考: "インドア派"},
{年齢: "40代", 性別 : "女", 思考: "アウトドア派"},
{年齢: "40代", 性別 : "女", 思考: "アウトドア派"},
];
const func = target => {
return (sum, val) => {
if( val[target] in sum ) {
sum[target]++;
}else {
sum[target] = 1;
}
return sum;
}
}
const output = array.reduce( func( "年齢" ), {});
// output = { 30代: 2, 20代: 1, 40代: 2 }
const output = array.reduce( func( "性別" ), {});
// output = { 男: 2, 女: 3 }
const output = array.reduce( func( "思考" ), {});
// output = { インドア派: 2, アウトドア派: 3 }
上記コードのように、reduce
に入力する関数を少し拡張してあげることによって、全ての項目を簡単かつ簡潔に集計することができました。
まとめ:reduceを利用してちゃちゃっと集計してみましょう
今回は、reduce
を利用して簡単に集計をしてみました。
実際には、reduce
の処理は初めて利用する人にはとっつきづらいと思います。
ただ、集計だけでなく、合算や配列の結合など、reduce
の利用用途は多岐に渡り、強力なメソッドです。
ぜひマスターしていきましょう!