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

【JavaScript】文字列プロパティの値でオブジェクト配列を並べ替える方法

はじめに

次のようなオブジェクトの配列があるとします。

const arr = [
    { first_name: 'Lazslo', last_name: 'Jamf' },
    { first_name: 'Pig', last_name: 'Bodine' },
    { first_name: 'Pirate', last_name: 'Prentice' }
];

この配列に対して、last_name キーの値をアルファベット順に並べ替えるJavaScript関数を作成する必要があります。

実装コード

以下はその実装例です。

const arr = [
    { first_name: 'Lazslo', last_name: 'Jamf' },
    { first_name: 'Pig', last_name: 'Bodine' },
    { first_name: 'Pirate', last_name: 'Prentice' }
];

const sortByLastName = arr => {
    arr.sort((a, b) => {
        return a.last_name.charCodeAt(0) - b.last_name.charCodeAt(0);
    });
};

sortByLastName(arr);
console.log(arr);

出力結果

コンソールには次のように出力されます。

[
    { first_name: 'Pig', last_name: 'Bodine' },
    { first_name: 'Lazslo', last_name: 'Jamf' },
    { first_name: 'Pirate', last_name: 'Prentice' }
]

コードの解説

Array.prototype.sort() メソッドは、比較関数を受け取ります。比較関数が負の値を返せば最初の引数を前に、正の値を返せば後ろに移動させます。上記のコードでは、charCodeAt(0) を使って各 last_name の先頭文字のUnicodeコードポイントを取得し、その差によって並べ替えを行っています。

注意点:localeCompare() を使ったより正確なソート

charCodeAt(0) の方法では先頭の1文字しか比較しないため、「Bodine」と「Brown」のように同じ頭文字を持つ文字列が存在すると、正しくソートされません。文字列全体を厳密に比較したい場合は、localeCompare() メソッドを使うのがおすすめです。

arr.sort((a, b) => a.last_name.localeCompare(b.last_name));

localeCompare() は文字列全体を自然な辞書順で比較できるため、日本語やアクセント付き文字なども含めて、より堅牢なソート処理を実現できます。

  1. JavaScriptのArray.prototype.sort()メソッドの使い方をサンプルコードで解説

    Array.prototype.sort()は、JavaScriptで配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並び方に加えて、昇順・降順も自由に指定でき、配列操作の中でも特に使用頻度の高いメソッドの一つです。 ただし重要なポイントとして、sort()メソッドはデフォルトではすべての要素を文字列に変換してから比較します。そのため、数値の配列を意図したとおりに並べ替えたい場合は、比較関数を引数として渡す必要があります。 以下は、Array.prototype.sort()メソッドの基本的な使い方を示すサンプルコードです。 サンプルコード <!DOC

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

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