2012-10-15 252 views
18

可能重複:
Sorting objects in an array by a field value in 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" 
    } 
] 
+2

的dynamicSort功能可能需要您要嘗試如何在這個例子中,因爲完成,通過'id'排序第一是沒有意義的,因爲所有的'id's和'一個更好的例子名字是獨一無二的。這相當於按「name」排序。 – Bill

+0

同意 - 你想要什麼樣的訂購語義在這裏? – Pointy

+2

不知道你希望通過排序列表兩次來實現。而當你做'返回(a.name - b.name)'你試圖從另一個字符串中減去一個字符串。不會發生。 (你可能想改用[localeCompare](http://www.tutorialspoint.com/javascript/string_localecompare.htm)。) –

回答

33

我認爲這是更好只是做...

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

第二次排序將基本否定了第一個,所以你必須做一次。 )

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(已簡化的數據位,以顯示我的點)。

+1

正是我需要的!對不起,我不太清楚,但這是完美的!謝謝! –

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)是不同的。但是當我做b,d和e都有235的ID時,它排序很好。

4

如果你的意思,你希望他們通過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; 
}); 

否則你的問題還不清楚。

0

你的問題是你如何排序字母。
a.name - b.name

是不是在做你的想法。它不是以書法順序對它們進行評估。 與

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

+0

如果名稱相同,爲什麼您的代碼返回「1」?它應該返回'0' – Bergi

+0

你是對的。這樣做並不能保證相同的元素將保持原來的順序。 – BostonJohn

1

取代它創建一個通用函數對它進行排序反正你想要的。檢查下面

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); 
相關問題