2012-11-05 50 views
1

我對這個主題的第一個問題得到了回答,它幫助我前進,所以我很抱歉,如果這似乎是重複的。我從第一個示例向前移動,現在正嘗試根據嵌套數組中每個元素的位置(1)處的值對嵌套數組中的元素進行排序。以下對數字數組很有用。排名數值嵌套數組

function mySorting(a, b) { 
    return a == b ? 0 : (b < a ? -1 : 1) 
} 

var myArray = [28, 92, 12, 12, 2]; 
myArray.sort(mySorting); 

var ranks = $.grep(myArray, function(item, idx) { 
    return item != myArray[idx - 1]; 
}).reverse(); 



$.each(myArray, function(idx, item) { 
    var rank= $.inArray(item, ranks)+1; 
    $('body').append('Rank of '+item+ ' is '+ rank+'<br>') 

})​ 

我的問題是,當我將陣列更改:

var myArray = [["textA",28], ["textB",92], ["textC",12], ["textD",12], ["textE",2]]; 

我的排序功能不再起作用。任何人都可以幫助我或指出我的方向正確嗎?我想根據每個嵌套元素中的數值對「myArray」進行排序。

再次感謝提前。

回答

0

傳遞給排序函數的參數是要排序的數組中包含的任何參數。你的新數組包含兩個元素的數組,所以當你對這個數組進行排序時,這就是排序函數將會得到的結果。

你說你想根據它們的第二個元素對二元素數組進行排序。要做到這一點,你應該改變你的排序功能,看起來像這樣:

function mySorting(a, b) { 
    return a[1] == b[1] ? 0 : (b[1] < a[1] ? -1 : 1) 
} 

編輯:如果你想用相同的第二元素分配同級別所有的陣列,您還可以需要修改代碼的其餘部分,以便在比較數組時僅考慮第二個元素。實際上,它可能是最容易保持排序,因爲它是,但只是扔掉一切,但第二個元素之前排列陣列:

function toSortKey(item) { 
    return item[1]; 
} 

function mySorting(a, b) { 
    return a == b ? 0 : (b < a ? -1 : 1); 
} 

var myArray = [["textA",28], ["textB",92], ["textC",12], ["textD",12], ["textE",2]]; 

var sortKeys = $.map(myArray, toSortKey); 
sortKeys.sort(mySorting); 

var ranks = $.grep(sortKeys, function(item, idx) { 
    return item != sortKeys[idx - 1]; 
}).reverse(); 

$.each(myArray, function(idx, item) { 
    var rank = $.inArray(toSortKey(item), ranks) + 1; 
    $('body').append('Rank of ' + item + ' is ' + rank + '<br>') 
})​; 
+0

ive過去試過,雖然它仍然排序中的項目數組它不再解釋這是我的主要問題。 – E7AD

+0

那麼你想在關係的情況下做什麼? –

+0

我喜歡它執行與我原來的帖子中的例子相同的功能,如果它是一個領帶,則根據他們的等級爲這些項目分配相同的等級值。如果你想看到正確的返回值,請檢查下面的提琴。 http://jsfiddle.net/XWs5j/1/您可以在下面的提琴中看到與嵌套數組的不同之處(不按預期工作)http://jsfiddle.net/pxGyj/1/ – E7AD