2013-07-05 101 views
0

我有下列排列列表的對象數組。問題在於排序錯誤,因爲OrderId屬性在所有標題中都不唯一。 OrderId從每個標題開始1,因此是問題。 請幫忙! 非常感謝使用JavaScript排序對象數組

// Class 
var Item = function(orderId, forename, surname, heading) { 
    this.OrderId = orderId; 
    this.Forename = forename; 
    this.Surname = surname; 
    this.Heading = heading; 
}; 

// Creation of objects 
var obj1 = new Item(1, "James", "Smith", "Heading1"); 
var obj2 = new Item(2, "Tracey", "Janes", "heading1"); 
var obj3 = new Item(3, "Sarah", "Cann", "Heading1"); 

var obj4 = new Item(1, "Matt", "Bars", "Heading2"); 
var obj4 = new Item(2, "Alex", "Magi", "Heading2"); 

// Add to array 
tempArray.push(obj1); 
tempArray.push(obj2); 
tempArray.push(obj3); 
tempArray.push(obj4); 

// Sort array 
tempArray.sort(function(a, b) { 
    var a1 = a.OrderId, b1 = b.OrderId; 
    if (a1 == b1) return 0; 
    return a1 > b1 ? 1 : -1; 
}); 

// Render array to screen - order by OrderId 
for(var i = 0; i < tempArray.length; i++) { 
    console.log(tempArray[i].Heading); 
    console.log(tempArray[i].Forename + " " + tempArray[i].Surname); 
} 

輸出我需要:

Heading 1 
    James Smith 
    Tracey Janes 
    Sarah Cann 

Heading 2 
    Matt Bars 
    Alex Magi 

由於將訂單不是唯一橫跨我得到了以下問題

Heading 1 
    James Smith 
    Matt Bars 
    Alex Magi 
    Tracey Janes 
    Sarah Cann 

Heading 2 
+0

http://stackoverflow.com/questions/16164078/grouped-sorting-on-a-js-array – georg

+2

你明白jQuery是什麼呢? –

+0

你的代碼似乎已經正確地對它進行了排序:http://jsfiddle.net/C7WCU/ – devrooms

回答

1

如果要作爲默認順序id然後你可以添加toString方法到你的Object並返回id作爲字符串,這是由.sort使用的:

var Item = function(orderId, forename, surname, heading) { 
    this.OrderId = orderId; 
    this.Forename = forename; 
    this.Surname = surname; 
    this.Heading = heading; 
}; 
Item.prototype.toString=function(){ 
    return this.OrderId+""; 
}; 
// create a bunch of Items 
tmpArray.sort();// done, it's sorted by id now 

如果你想它一定的鍵(一個或多個)排序,那麼你可以傳遞一種功能tmpArray.sort

function sortItems(arr,keys){ 
    var len=keys.length; 
    arr.sort(function(a,b){ 
    var i=0; 
    while(a[keys[i]]===b[keys[i]]&&i<len){ 
     i++; 
    } 
    return i===len?0:(a[keys[i]]>b[keys[i]])?1:-1; 
    } 
}; 
// sort by Surname then by Forename (if 2 items have same Surname) 
sortItems(tmpArray,["Surname", "Forename"]); 

看着你的問題,我再次看到它的不就是排序問題,但分組。這裏有一個函數可以爲你實現分組。

var Item = function(orderId, forename, surname, heading) { 
    this.OrderId = orderId; 
    this.Forename = forename; 
    this.Surname = surname; 
    this.Heading = heading; 
}; 


// Creation of objects 

var obj1 = new Item(1, "James", "Smith", "Heading1"); 
var obj2 = new Item(2, "Tracey", "Janes", "Heading1"); 
var obj3 = new Item(3, "Sarah", "Cann", "Heading1"); 

var obj4 = new Item(1, "Matt", "Bars", "Heading2"); 
var obj5 = new Item(2, "Alex", "Magi", "Heading2"); 

var tempArray=[]; 
tempArray.push(obj1); 
tempArray.push(obj2); 
tempArray.push(obj3); 
tempArray.push(obj4); 
tempArray.push(obj5); 
function sortItems(arr,keys){ 
    var len=keys.length; 
    arr.sort(function(a,b){ 
    var i=0; 
    while(a[keys[i]]===b[keys[i]]&&i<len){ 
     i++; 
    } 
    return i===len?0:(a[keys[i]]>b[keys[i]])?1:-1; 
    }); 
}; 
// sort on Heading 
sortItems(tempArray,["Heading","Forename","Surname"]); 
function groupBy(arr,key){ 
    var i=0,ret={}; 
    for(i=0;i<arr.length;i++){ 
    if(!ret[arr[i][key]]){ 
     ret[arr[i][key]]=[]; 
    } 
    ret[arr[i][key]].push(arr[i]); 
    } 
    return ret; 
}; 
var grouped=groupBy(tempArray,"Heading"); 
var key="",i =0,ret=[]; 
// If any code in your page adds to Object.prototype then this breaks 
// like Object.prototype.mySmartFuncion since mySmartFunciton will show 
// up as key in for key in anyObject 
for(key in grouped){ 
    ret.push(grouped[key][0].Heading); 
    for(i=0;i<grouped[key].length;i++){ 
    ret.push("\t"+grouped[key][i].Forename + grouped[key][i].Surname); 
    } 
} 
console.log(ret.join("\n")); 
+0

這個'工作' - 但不幸的是,它導致我的問題,因爲它按字母順序排序標題,這不是我需要它的順序。 –

+0

@JamesRadford修復你的問題需要排序和分組,爲我的答案添加了代碼以解決分組問題。 – HMR

+0

這並沒有什麼區別(?) –