2013-05-02 49 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