【JavaScript】一次元配列を二次元配列に変換する方法
はじめに
こんにちは、SHIFTのITソリューション部に所属しているTanakaです。現在は開発支援プロダクト推進部のテックブースト(以下、TB)プロジェクトに参画しています。
私は現在、Node.js実行環境を用いたJavaScriptでの開発に従事しているのですが、今回はその開発の中で知った、一次元配列を二次元配列に変換する方法について、紹介させていただければと思います。
一次元配列と二次元配列について
まず前提知識として、一次元配列と二次元配列について軽く説明します。
一次元配列とは、シンプルに[ ]で囲まれる配列のことです。
一次元配列の例(本記事内の個人情報はランダム生成したものであり、実在する人物、組織等とは関係ありません)
[
"氏名",
"年齢",
"性別",
"今野 智博",
"75",
"男",
"藁谷 玲",
"77",
"女",
"辻川 ゆきこ",
"36",
"女",
"宮崎 政利",
"45",
"男",
"中村 裕加里",
"43",
"女",
"内山 やよい",
"57",
"女",
"早川 豊",
"47",
"男",
"杉山 彩美",
"33",
"女",
"廣瀬 綾子",
"66",
"女",
"遠藤 寿彦",
"44",
"男",
];
一階層に全ての情報が入っていてとても見にくいですね。
一方で二次元配列とは、[ ]の中にもう一階層[ ]が入っている、[ [ ], [ ], [ ] ]のような形の配列のことをいいます。二次元以上の配列を、多次元配列といいます。
多次元配列の例
[
["氏名", "年齢", "性別"],
["今野 智博", "75", "男"],
["藁谷 玲", "77", "女"],
["辻川 ゆきこ", "36", "女"],
["宮崎 政利", "45", "男"],
["中村 裕加里", "43", "女"],
["内山 やよい", "57", "女"],
["早川 豊", "47", "男"],
["杉山 彩美", "33", "女"],
["廣瀬 綾子", "66", "女"],
["遠藤 寿彦", "44", "男"],
];
どうでしょう、見やすくないですか?
こうすることで、連想配列への変換や列数での処理ができるようになります。
二次元以上の多次元配列は、データを管理・操作するにあたり、一次元配列よりも便利です。
その例を次の見出しで紹介します。
※「最初から二次元配列使えばいいじゃん」と思うかもしれませんが、スクレイピングなどで情報を取得する際、データが
['header', 'header', 'header', 'value', 'value', value']
のような、整形する必要がある配列で出てくる場合があります。
多次元配列の便利さ
多次元配列がどうして便利か、簡単な例を挙げて説明します。
先ほどの多次元配列から、45歳以上のデータを抽出したいとします。
const data = [
["氏名", "年齢", "性別"],
["今野 智博", "75", "男"],
["藁谷 玲", "77", "女"],
["辻川 ゆきこ", "36", "女"],
["宮崎 政利", "45", "男"],
["中村 裕加里", "43", "女"],
["内山 やよい", "57", "女"],
["早川 豊", "47", "男"],
["杉山 彩美", "33", "女"],
["廣瀬 綾子", "66", "女"],
["遠藤 寿彦", "44", "男"],
];
const over45Age = data.filter((row) => row[1] >= 45); // 45歳よりも上の年齢のデータだけを抽出
console.log(over45Age);
/*
出力結果は
[
[ '今野 智博', '75', '男' ],
[ '藁谷 玲', '77', '女' ],
[ '宮崎 政利', '45', '男' ],
[ '内山 やよい', '57', '女' ],
[ '早川 豊', '47', '男' ],
[ '廣瀬 綾子', '66', '女' ]
]
*/
上の例では、dataに代入したデータのうち、45歳以上のデータだけをArray.prototype.filter()メソッドで抽出し、over45Ageという新しい変数に代入しています。なお、今回は簡単化のためアロー関数を用いています。
結果として、45歳以上のデータが正しく出力されていることがわかります。
列番号1を指定するだけで、簡単に抽出することができました。
これを一次元配列で行おうとすると、行と列の概念がないので、とても複雑な処理をさせなければなりません。
想像もしたくないですね…
ちなみに、filter()メソッドの使い方も過去に記事にしたので、よければ読んでみてくださいね!
一次元配列→二次元配列への変換方法
先ほどの例の通り、どうせなら配列を二次元に変換してから処理できれば、とても便利ですよね。
ということで、今回はJavaScriptの標準組み込みモジュールで解決しちゃいましょう!
const data = [
'氏名',
'年齢',
'性別',
'今野 智博',
'75',
'男',
'藁谷 玲',
'77',
'女',
'辻川 ゆきこ',
'36',
'女',
'宮崎 政利',
'45',
'男',
'中村 裕加里',
'43',
'女',
'内山 やよい',
'57',
'女',
'早川 豊',
'47',
'男',
'杉山 彩美',
'33',
'女',
'廣瀬 綾子',
'66',
'女',
'遠藤 寿彦',
'44',
'男'
];
console.log(data);
const newData = [];
try {
while (data.length) newData.push(data.splice(0, 3)); // dataの残りがある限り、dataの0番目から3つ分のデータを、newDataの最後尾にpushする
console.log(newData);
const over45Age = newData.filter((row) => row[1] >= 45); // 45歳よりも上の年齢のデータだけを抽出
console.log(over45Age);
} catch (error) {
console.error(error);
}
/*
console.log(newData);の出力結果は
[
[ '氏名', '年齢', '性別' ],
[ '今野 智博', '75', '男' ],
[ '藁谷 玲', '77', '女' ],
[ '辻川 ゆきこ', '36', '女' ],
[ '宮崎 政利', '45', '男' ],
[ '中村 裕加里', '43', '女' ],
[ '内山 やよい', '57', '女' ],
[ '早川 豊', '47', '男' ],
[ '杉山 彩美', '33', '女' ],
[ '廣瀬 綾子', '66', '女' ],
[ '遠藤 寿彦', '44', '男' ]
]
console.log(over45Age);の出力結果は
[
[ '今野 智博', '75', '男' ],
[ '藁谷 玲', '77', '女' ],
[ '宮崎 政利', '45', '男' ],
[ '内山 やよい', '57', '女' ],
[ '早川 豊', '47', '男' ],
[ '廣瀬 綾子', '66', '女' ]
]
*/
どうでしょうか、配列の次元を変換し、無事抽出できたと思います。
ここからは変換に使ったメソッド等の解説をしていきます。
splice() メソッドは、その場で既存の要素を取り除いたり、置き換えたり、新しい要素を追加したりすることで、配列の内容を変更するメソッドです。
基本的な構文
元の変数名.splice(取り除き始める位置, 取り除く値の個数, 挿入する値1, 挿入する値2, ... )
push()メソッドは、指定した配列の最後尾に値を挿入するメソッドです。
基本的な構文
push先の変数名.push(値1, 値2, ...)
.lengthは配列のプロパティで、配列の要素の数を取得できます。
基本的な構文
配列名.length;
while文は、条件がtrueの間、指定された処理を実行する構文です。複数処理をさせたい場合は、{処理1, 処理2}のように、処理を{ }で囲む必要があります。
基本的な構文
while (条件) 処理;
これらを踏まえて変換コードの解説をすると、
dataの0番目から3つ分のデータを抽出する
1をnewDataの最後尾にpushする
dataの残りがある限り、1と2を実行し続ける
というフローになっています。
なお、今回のエラーハンドリングは簡単のため、try-catch構文を用いています。
最後に、今回の変換コードのフォーマットを書いておきます。取り除く値の個数は自由に調節できます。
皆さん使ってみてくださいね!
const 変換先の変数名 = [];
while (変換元の変数名.length)
変換先の変数名.push(変換元の変数名.splice(0, 取り除く値の個数));
おわりに
今回の記事では、一次元配列を二次元配列に変換する方法を紹介しました。
プロジェクトでは、最終的に一次元配列→二次元配列→連想配列まで変換したのですが、その方法についてはいずれ別の記事に書こうと思います。
この記事が私と同じようなJavaScript初学者の助けになれば幸いです。
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/
PHOTO:UnsplashのOskar Yildiz