37

重複の可能性:
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"
    }
]
4

5 に答える 5

75

私はそれがちょうどで行われた方が良いと思います...

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)id式は最初にsを比較します。それらが等しい場合にのみ、名前を比較します(そしてこの比較の結果を返します)。

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

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

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

于 2012-10-15T16:43:17.333 に答える
6

Create a general function to sort it anyway you want. Check the dynamicSort function below

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);  
于 2012-10-15T17:00:32.983 に答える
5

それらを並べ替える必要がある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;
});

そうでなければ、あなたの質問は不明確です。

于 2012-10-15T16:43:45.873 に答える
3

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

あなたが思っていることをしていません。辞書式順序でそれらを評価していません。に置き換えます

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

于 2012-10-15T16:44:53.563 に答える
0

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にすると、問題なくソートされます。

于 2012-10-15T16:42:29.673 に答える