JavaScriptでfalsy値を持つオブジェクトを配列の末尾に移動して降順ソートする方法
課題
次のようなオブジェクトの配列があるとします。
const array = [
{key: 'a', value: false},
{key: 'a', value: 100},
{key: 'a', value: null},
{key: 'a', value: 23}
];
ここで求められているのは、このような配列を受け取り、「value」プロパティがfalsy(false・null・undefined・空文字列など)であるオブジェクトをすべて配列の末尾に移動し、それ以外のオブジェクトを「value」プロパティの降順に並べ替えるJavaScriptの関数を作成することです。
解決のアプローチ
この要件は、Array.prototype.sort() にカスタム比較関数を渡すことで簡潔に実現できます。まず、「value」プロパティがfalsyかどうかを判定するヘルパー関数 isValFalsy を用意しておきましょう。
コード例
実際のコードは以下のとおりです。
const arr = [
{key: 'a', value: false},
{key: 'a', value: 100},
{key: 'a', value: null},
{key: 'a', value: 23}
];
const isValFalsy = (obj) => !obj.value && typeof obj.value !== 'number';
const sortFalsy = arr => {
arr.sort((a, b) => {
if(isValFalsy(a) && isValFalsy(b)){
return 0;
}
if(isValFalsy(a)){
return 1;
}
if(isValFalsy(b)){
return -1;
}
return b.value - a.value;
});
};
sortFalsy(arr);
console.log(arr);
実行結果
コンソールには次のように出力されます。
[
{ key: 'a', value: 100 },
{ key: 'a', value: 23 },
{ key: 'a', value: false },
{ key: 'a', value: null }
]
コードの解説
- isValFalsy 関数:
!obj.valueで値がfalsyかどうかを判定しつつ、typeof obj.value !== 'number'という条件により、0などの数値型はfalsyとはみなされず、通常の数値としてソートされます。 - 比較ロジック:両方の要素がfalsyなら順序を維持し(
return 0)、片方だけがfalsyの場合はその要素を後ろへ移動させます(return 1/return -1)。両方ともtruthyであればb.value - a.valueによって降順に並べ替えます。 - 注意点:JavaScriptの
sort()は元の配列を直接変更する破壊的なメソッドです。元の配列を保持したい場合は、[...arr]のようにコピーしてからソートすると安全です。
-
JavaScriptでfalsy値(偽と評価される値)を見分ける方法
JavaScriptにおけるfalsy値とはJavaScriptでは、値をBoolean型として評価したときに「false」とみなされる値がいくつか存在します。これらは「falsy値(偽の値)」と呼ばれます。条件分岐や論理演算において、意図しない動作を防ぐために、どの値がfalseと評価されるかを正しく理解しておくことが重要です。JavaScriptでfalseと評価される主な値は以下の通りです。false — Boolean型のfalseそのもの0 — 数値のゼロ空文字列:、、または ``(テンプレートリテラル)null — 値が存在しないことを示す特殊な値undefined — 値が未定義
-
JavaScriptで2つのオブジェクトを比較しながら配列のネストされた値をグループ化する方法
この記事では、2つのオブジェクト(before と after)を比較しながら、ネストされた配列の値を1つの行にグループ化する方法を解説します。データの差分を表形式で整理したい場合などに役立つテクニックです。入力データの例まず、次のようなJSONオブジェクトがあるとします。before(変更前)と after(変更後)の2つの状態が含まれ、それぞれの device 配列の中に、id、price、features(機能名と価格)というネストされた構造を持っています。const input = { before: { device: [ { id: 1234