JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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] のようにコピーしてからソートすると安全です。
  1. JavaScriptでfalsy値(偽と評価される値)を見分ける方法

    JavaScriptにおけるfalsy値とはJavaScriptでは、値をBoolean型として評価したときに「false」とみなされる値がいくつか存在します。これらは「falsy値(偽の値)」と呼ばれます。条件分岐や論理演算において、意図しない動作を防ぐために、どの値がfalseと評価されるかを正しく理解しておくことが重要です。JavaScriptでfalseと評価される主な値は以下の通りです。false — Boolean型のfalseそのもの0 — 数値のゼロ空文字列:、、または ``(テンプレートリテラル)null — 値が存在しないことを示す特殊な値undefined — 値が未定義

  2. JavaScriptで2つのオブジェクトを比較しながら配列のネストされた値をグループ化する方法

    この記事では、2つのオブジェクト(before と after)を比較しながら、ネストされた配列の値を1つの行にグループ化する方法を解説します。データの差分を表形式で整理したい場合などに役立つテクニックです。入力データの例まず、次のようなJSONオブジェクトがあるとします。before(変更前)と after(変更後)の2つの状態が含まれ、それぞれの device 配列の中に、id、price、features(機能名と価格)というネストされた構造を持っています。const input = { before: { device: [ { id: 1234