2011-11-05 49 views
0

可能重複:
How to sort an array of objects?排序的記錄數組升序

鑑於學生下面的記錄的陣列 - 你將如何按升序排列,根據年齡的Javascript使用它們排序?

students = [{ 
name: "timothy", 
age: "9"}, 
{ 
name: "claire", 
age: "12"}, 
{ 
name: "michael", 
age: "20"}] 
+0

升序由什麼性質?爲什麼年齡是弦而不是數字? –

+0

首先定義您正在排序的內容,因爲您可以按照您的示例中的年齡或姓名進行排序。通過使用整數實現多種排序算法,年齡很容易。對於名稱,可以轉換爲和ASCII表示,然後再對整數值進行排序。查看維基百科上的快速排序。 – OnResolve

+0

你可以在這裏找到這個主題的一些有用的答案:** [通過JavaScript中的字段值對數組中的對象進行排序](http://stackoverflow.com/a/26759350/2247494)** – jherax

回答

1

按年齡進行升序排列,使用Array.sort使用自定義比較函數:

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

// students will be 
[{name: "timothy", age: "9"}, 
{name: "claire", age: "12"}, 
{name: "michael", age: "20"}] 
+0

函數應該執行在執行減法之前parseInt?我會想象如果它是基於字符串表示完成的話,它可能會返回愚蠢的結果。 –

+0

@Joel'parseInt(age,10)'肯定會起作用,但不是絕對必要的。減法操作將操作數強制轉換爲數字。 –

+1

如果其中一個值不能轉換爲數字,則會返回NaN。 –

0

通過年齡:

students = students.sort(function(a, b) { 
    return parseFloat(a.age) - parseFloat(b.age); 
}); 
+0

你不需要'parseFloat'(減法將強制編號),你不需要賦值('Array.sort'就地)。 –

0
student.sort(function(a,b){ 

if (a.name > b.name) 
    return -1; 
return 1; 

}); 
+0

不能在'Object'上使用'>'。那麼什麼時候'a === b'? –

+0

@MattBall現在糾正。謝謝。 – sathis

0

讀了這個例子:

var marks = new Array(10,12,11,20,2); 
     for(var i=0;i<marks .length;i++) //Hold the first element 
    { 
     for(var j=i+1;j<marks.length;j++) //Hold the next element from the first element 
     { 
      if(Number(marks[i]) > Number(marks[j])) //comparing first and next element 
      { 
       tempValue = marks[j]; 
       marks[j] = marks[i]; 
       marks[i] = tempValue; 
      } 
     } 
    } 
     document.write(marks); 
+2

這是一個**糟糕的排序實施。 –

+0

我試過了,它不起作用? jsfiddle.net/EH8Pm/2/ – jasonscott

+0

@jason:在你的jfiddle例子中,你只交換年齡,而不是整個數組元素。此外,你輸出'標記'而不是'學生'。 –

0
students.sort(function(a,b){ 
     if (+a.age > +b.age) return 1; 
     return -1; 
}); 
// Now the object is ordered by age (min to max) 

如果你想知道,+ a.age相同號(a.age)

+0

如果兩個人有同樣的年齡? –

+0

他們根據他們以前在陣列中的位置(隨機類型)聚合在一個位置上。如果你想在年齡相等的時候按字母順序排列它們,你可以在開始處寫入if'(+ a.age == + b.age)return [a.name,b.name] .sort()[0] = = a.name? -1:1;' –