JavaScriptで配列内の数値を正の数と負の数に分割して別々の配列に格納する方法
概要
配列を受け取り、positive(正の数)と negative(負の数)という2つのプロパティを持つオブジェクトを返す関数を作成します。各プロパティには、元の配列から分類された正の数・負の数がそれぞれ配列として格納されます。
このタスクは非常にシンプルです。Array.prototype.reduce() メソッドを使えば、条件に合致する要素を取り出しながら、2つの配列からなる1つのオブジェクトへ効率よく振り分けることができます。配列全体を1回だけ走査すればよいため、パフォーマンス面でも優れたアプローチです。
実装例
const arr = [
[12, -45, 65, 76, -76, 87, -98],
[54, -65, -98, -23, 78, -9, 1, 3],
[87, -98, 3, -2, 123, -877, 22, -5, 23, -67]
];
const splitArray = (arr) => {
return arr.reduce((acc, val) => {
if(val < 0){
acc['negative'].push(val);
} else {
acc['positive'].push(val);
}
return acc;
}, {
positive: [],
negative: []
})
};
for(let i = 0; i < arr.length; i++){
console.log(splitArray(arr[i]));
}
コードのポイント
reduce()の初期値として{ positive: [], negative: [] }を指定しています。- コールバック関数内で各要素を判定し、負の数なら
negative配列へ、それ以外(0を含む)ならpositive配列へ追加します。 - 最終的に累積オブジェクト
accを返すことで、1回のループで分類が完了します。
実行結果
コンソールには次のように出力されます。
{ positive: [ 12, 65, 76, 87 ], negative: [ -45, -76, -98 ] }
{ positive: [ 54, 78, 1, 3 ], negative: [ -65, -98, -23, -9 ] }
{
positive: [ 87, 3, 123, 22, 23 ],
negative: [ -98, -2, -877, -5, -67 ]
}
補足:filter() を使った別の書き方
reduce() 以外にも、filter() を使えばより直感的に記述できます。
const splitArray = (arr) => ({
positive: arr.filter(val => val >= 0),
negative: arr.filter(val => val < 0)
});
こちらのコードは簡潔で読みやすい反面、配列を2回走査するため、要素数が非常に多いデータを扱う場合は reduce() を使った1回のループで完結する方法の方が有利です。用途やデータサイズに応じて使い分けるとよいでしょう。
-
JavaScriptで既存の配列を別の配列で拡張する方法|concat()の使い方を解説
配列を別の配列で拡張するには?JavaScriptで既存の配列に別の配列を結合して拡張したい場合は、Array.concat()メソッドを使用します。concat()は、元の配列を変更することなく、複数の配列や値をつなげた新しい配列を返すのが特徴です。サンプルコード以下は、既存の配列numbersに別の配列numbers2をconcat()で結合する例です。<html> <head> <title>JavaScript Array concat Method</title>&nb
-
JavaScriptで正と負の無限大(Infinity)の値を出力する方法
JavaScriptで扱える数値には上限があり、その範囲を超えた演算結果は特別な値「Infinity」(正の無限大)または「-Infinity」(負の無限大)として出力されます。この記事では、実際に正と負の無限大の値を画面に出力するサンプルコードを紹介します。 JavaScriptにおける無限大(Infinity)とは JavaScriptの数値型はIEEE 754で定められた倍精度浮動小数点数で、表現できる最大値は Number.MAX_VALUE(約1.79×10308)です。演算結果がこの最大値を超えると、エラーにはならずグローバルプロパティの Infinity が返されます。 正の方