2013-07-12 153 views
1

我是js的新手,嘗試按兩個字段對對象數組進行排序 - 從第一個屬性開始,然後是第二個屬性。這兩個屬性都是數字。通過多個屬性對數組中的對象進行排序

的數據是:

var homes = [{ 
    "h_id": "3", 
    "minimumorder": "12", 
    "price": "17" 
    }, { 
    "h_id": "4", 
    "minimumorder": "1", 
    "price": "20" 
}, { 
    "h_id": "5", 
    "minimumorder": "1", 
    "price": "18.10" 
} 

有所述陣列中多個對象,這是一個簡化的例子。下面的代碼ALMOST讓我有,但爲minimumorder財產它把經過1 12後,而不是6:

cmp = function(a, b) { 
    parseFloat(a); 
    parseFloat(b); 
    if (a > b) return +1; 
    if (a < b) return -1; 
    return 0; 
} 

homes.sort(function(a, b) { 
    return cmp(a.minimumorder,b.minimumorder) || cmp(a.price,b.price) 
}) 

的jsfiddle here

任何幫助都會受到高度的讚賞,因爲我一直在搜索和修補幾個小時,試圖弄清楚這一點。

回答

4

您需要重新分配解析值回ab

a = parseFloat(a); 
b = parseFloat(b); 

否則它結束了比較字符串,並且發生121詞彙,就像字at進來字典a後後。

Updated fiddle

+0

血腥的傳說。感謝堆! – martellalex

0

好,

您應該使用這樣的代碼:

function sortHomes(homes) 
{ 
var temp_homes = new Array(); 
var new_homes = new Array(); 

for(var i = 0; i < homes.length; i++) temp_homes[i] = homes[i]; 

var maximum = 0, minimum; 

for(i = 0; i < temp_homes.length; i++) maximum = Math.max(maximum, temp_homes.minimumorder); 

var min_price, j, k, indexes, price_indexes; 

for(i = 0; i < temp_homes.length; i++){ 
    minimum = maximum; 
    for(j = 0; j < temp_homes.length; j++){ 
    minimum = Math.min(minimum, temp_homes[j].minimumorder); 
    } 
    indexes = getIndexes(temp_homes, minimum, "minimumorder"); 
    if(indexes.length == 1){ 
    new_homes.push(temp_homes[indexes[0]]); 
    temp_homes[indexes[0]].minimumorder = maximum + 1; 
    } 
    else{ 
    for(j = 0; j < indexes.length; j++){ 
    min_price = maximum; 
    for(k = 0; k < indexes.length; k++){ 
    min_price = Math.min(min_price, temp_homes[indexes[k]].price); 
    } 
    price_indexes = getIndexes(temp_homes, min_price, "price"); 
    for(k = 0; k < price_indexes.length; k++){ 
    new_homes.push(temp_homes[price_indexes[k]]); 
    temp_homes[price_indexes[k]].price = maximum + 1; 
    } 
    } 
    } 
} 
} 

function getIndexes(arr, el, name) 
{ 
var indexes = new Array(); 
for(var i = 0; i < arr.length; i++) if(arr[i][name] == el) indexes.push(i); 
return indexes; 
} 

它應該工作。 如果沒有,請通知我。

哦,爲了家庭進行排序,只需使用:

家園= sortHomes(院);

相關問題