2013-05-02 38 views
3

我的結果學生應按房間編號分組(!),然後在組內按年齡分類。JavaScript:按鍵組合項目,按另一個鍵對組中的項目(!)進行排序 - 如何?

結果分組/排序由房:

Name  | R | Age 
------------------- 
Student 2 | 1 | 22 
Student 4 | 1 | 25 
Student 3 | 3 | 21 
Student 6 | 3 | 27 
Student 1 | 5 | 29 <- Wrong, should be: Student 5, Room 5, Age 23 
Student 5 | 5 | 23 <- Wrong, should be: Student 1, Room 5, Age 29 

當前的代碼(的jsfiddle:http://jsfiddle.net/n9KNx/):

<script type="text/javascript"> 
/* add students */ 
var students = new Array(); 
students.push({ name: "Student 1", room_id: 5, age: 29 }); 
students.push({ name: "Student 2", room_id: 1, age: 22 }); 
students.push({ name: "Student 3", room_id: 3, age: 21 }); 
students.push({ name: "Student 4", room_id: 1, age: 25 }); 
students.push({ name: "Student 5", room_id: 5, age: 23 }); 
students.push({ name: "Student 6", room_id: 3, age: 27 }); 

/* sort by room_id */ 
students.sort(function(a, b) { 
    return ((a.room_id < b.room_id) ? -1 : ((a.room_id > b.room_id) ? 1 : 0)); 
}); 

/* FIXME: sort by age without changing the room order */ 
/* ... code ... */ 

/* build HTML output */ 
var html = '<table>'; 
html += '<tr><th>Name</th><th>Room</th><th>Age</th></tr>'; 
for (var i = 0; i < students.length; i++) { 
    html += '<tr><td>'+ students[i].name +'</td><td>'+ students[i].room_id +'</td> <td>'+ students[i].age +'</td></tr>'; 
} 
html += '</table>'; 

$("#students").html(html); 
</script> 

<div id="students">...</div> 

你會如何每個組內的學生按年齡排序?我在JSFiddle上添加了代碼,隨時隨地使用它!

+0

可能重複[如何排序的對象有多個域值的數組在JavaScript中](http://stackoverflow.com/questions/11379361/how-to-sort-an-array-of-objects-with-multiple-field-values-in-javascript) – Bergi 2013-05-02 09:48:16

回答

4

當房間相等時,需要擴展排序功能以覆蓋。當房間相等時,我們再比較年齡。

students.sort(function(a, b) { 
    if(a.room_id < b.room_id){ 
     return -1; 
    }else if(a.room_id > b.room_id){ 
     return 1; 
    }else{ 
     if(a.age < b.age){ 
      return -1 
     }else if(a.age > b.age){ 
      return 1; 
     }else{ 
      return 0; 
     } 
    } 
}); 

工作實例http://jsfiddle.net/n9KNx/1/

+1

所以這返回'undefined' if他們是平等的? – Bergi 2013-05-02 09:50:06

+1

@Bergi良好的捕獲,我已經更新。 – 2013-05-02 09:51:58

1
students.sort(function(a, b) { 
    return ((a.room_id < b.room_id) ? -1 : 
       ((a.room_id > b.room_id) ? 1 : 
       ((a.age < b.age) ? -1 : 
        ((a.age > b.age) ? 1 : 0)))); 
}); 
2

既然你對數字排序,你不需要做three-way comparisons只是可以計算的差異。該解決方案看起來那麼像這樣:

students.sort(function(a, b) { 
    return (a.room_id - b.room_id) || (a.age - b.age); 
}); 

...和做完全一樣的東西從其他的答案漫長的片段:-)的

+1

我有一種感覺,比我的級聯三叉戟有更好的成語。 – Barmar 2013-05-02 11:32:36

相關問題