web-dev-qa-db-ja.com

オブジェクトのjavascript配列を数値的に並べ替えてからアルファベット順に並べ替えるにはどうすればよいですか?

可能性のある複製:
JavaScriptのフィールド値による配列内のオブジェクトのソート

オブジェクトの配列を(IDで)数値的に、次に(名前で)アルファベット順にソートするにはどうすればよいですか?

現在の方法は無効な出力を提供しています。

これは私がソートしようとしているオブジェクトです

var items = [
    {
        "id": 165,
        "name": "a"
    },
    {
        "id": 236,
        "name": "c"
    },
    {
        "id": 376,
        "name": "b"
    },
    {
        "id": 253,
        "name": "f"
    },
    {
        "id": 235,
        "name": "e"
    },
    {
        "id": 24,
        "name": "d"
    },
    {
        "id": 26,
        "name": "d"
    }
]

そして、私がソートしようとしている方法

items.sort(function(a, b) {
    return (a.id - b.id);
}).sort(function(a, b) {
    return (a.name - b.name);
});

これがjsfiddleです。

http://jsfiddle.net/jh4xb/

編集:混乱して申し訳ありませんが、私はしばらくの間、この問題にとても混乱しています。

私が達成しようとしているのは、最初に最高のIDでソートし、次にアルファベット順にソートして、最終的に次のようにすることです:

var items = [
    {
        "id": 376,
        "name": "b"
    },
    {
        "id": 253,
        "name": "f"
    },
    {
        "id": 236,
        "name": "c"
    },
    {
        "id": 235,
        "name": "e"
    },
    {
        "id": 165,
        "name": "a"
    },
    {
        "id": 26,
        "name": "d"
    },
    {
        "id": 24,
        "name": "d"
    }
]
25
Dennis Martinez

私はそれだけで良くやったと思う...

_items.sort(function(a, b) { 
  return a.id - b.id  ||  a.name.localeCompare(b.name);
});
_

2番目の並べ替えは基本的に最初の並べ替えを無効にするため、1回行う必要があります。 )

a.id - b.id || a.name.localeCompare(b.name)式は最初にidsを比較します。それらが等しい場合にのみ、名前を比較します(そしてこの比較の結果を返します)。

順序を逆にする必要がある場合は、位置を入れ替えます(_b.id - a.id_など)-またはすべてを無効にします:

_items.sort(function(a, b) { 
  return - ( a.id - b.id  ||  a.name.localeCompare(b.name) );
});
_

ここに JSFiddle があります(私のポイントを示すためにデータを少し単純化する必要があります)。

47
raina77ow

idで並べ替えたい場合、およびidが一致する場合、nameで並べ替えたい場合は、次を使用します。

items.sort(function(a, b) {
    if (a.id !== b.id) {
        return a.id - b.id
    }
    if (a.name === b.name) {
      return 0;
    }
    return a.name > b.name ? 1 : -1;
});

それ以外の場合、質問は不明です。

5

必要に応じて並べ替える一般的な関数を作成します。以下のdynamicSort関数を確認してください

var items = [
{
 "id": 165,
 "name": "a"},
{
 "id": 236,
 "name": "b"},
{
 "id": 376,
 "name": "c"},
{
 "id": 253,
 "name": "d"},
{
 "id": 235,
 "name": "e"},
{
  "id": 24,
  "name": "f"}
];

function dynamicSort(property) {
   return function(a, b) {
       return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
   }
}

items.sort(dynamicSort('name')).sort(dynamicSort('id'));
console.log(items);
items.sort(dynamicSort('id')).sort(dynamicSort('name')); 
console.log(items);  
4
bhb

あなたの問題は、あなたがどのように手紙を分類しているかです。
a.name - b.name

あなたが思っていることをやっていない。字句順にそれらを評価するのではありません。に置き換える

a.name < b.name ? -1 : 1;

1
BostonJohn

Chromeでエラーは表示されませんが、正しくソートされていません。

ソートコードをこれに変更すると:

var firstRun = items.sort(function(a, b) {
    return (a.id - b.id);
});
var secondRun = firstRun.sort(function(a, b) {
    return (a.name - b.name);
});

console.log(secondRun);​

正しくソートされていると思います。あなたの例では、各番号(id)が異なるため、実際に2番目のソートを行う必要はありません。しかし、b、d、eのIDをすべて235にすると、うまくソートされます。

0
David Hoerster