2013-05-30 85 views
8

我想以自定義的方式對數組進行排序。例子是一個學生的classlevel:如何將自定義排序應用於數組?

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(classlevel){ 
    // ?? 
}) 

理想的情況下,排序應該返回:

["Freshman","Sophomore","Junior","Senior"] 

我想我可以預先排名的classlevels提前時間是這樣的:

var classlevelRanked = [{ class: "Junior", 
    rank: 3 
},{ class: "Senior", 
    rank: 4 
},{ class: "Freshman", 
    rank: 1 
},{ class: "Sophomore", 
    rank: 2 
}] 

然後通過以下方式應用排序:

_.sortBy(classlevelRanked, function(classlevel){ 
    return classlevel.rank; 
}) 

但後來我不得不這樣做,以帶出的隊伍:

.map(function(classlevel){ 
    return classlevel["class"]; 
}) 

有沒有一種更直接的方式來做到這一點無需預先排名-的classlevels再剝離出來之後?

回答

31

你應該能夠做這樣的事情:

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(element){ 
    var rank = { 
     "Junior" : 3, 
     "Senior" : 4, 
     "Freshman" :1, 
     "Sophomore" :2 
    }; 

    return rank[element]; 
}); 

小提琴:

http://jsfiddle.net/hKQj8/

+0

正是我要找的陣列。謝謝!! – Kevin

+0

JS 101:把你的排名放在回調聲明之外,不需要每次重新定義「排名」...... – mpowered

+0

@mpowered,我認爲這可能是一個不成熟的優化。瀏覽器應該能夠將其識別爲常量並編譯一次。你也可以編寫兩個函數:一個聲明排名並返回第二個排名的函數。將'rank'移到函數範圍外會污染全局範圍,因爲它只適用於該函數,所以最好在那裏。 – Jason

4

做它超級的hackish /糟糕的方式!!!!死的簡單/瘋狂的混亂:)

function rank(word){ 
    return Math.abs(113-word.trim().toLowerCase().charCodeAt(1)); 
} 

console.log(rank('freshman')); // 1 
console.log(rank('sophomore')); // 2 
console.log(rank('junior')); // 4 
console.log(rank('senior')); // 12 

編輯:

由於人們似乎找到這個答案很有用,這裏是它如何工作的解釋......這種種基於一個字母字提供。由於「大二」和「大四」有重複的第一個字母,我選擇按第二個字母排序,每個單詞都有一個唯一的值。

然後這樣就可以這樣命令:sEnior,sOphomore,fReshman,jUnior。爲了對它們進行正確的排序,我使用Q(113)的字符代碼進行了減法運算,它恰好在R的旁邊(適用於新生)。這意味着每個單詞的第二個字母與Q的關係決定了順序。爲了防止負數,該函數獲取結果的絕對值,並返回該值。

+2

準確地說我在找什麼!謝謝!!! –

+1

非常好!完美的作品 –

5

除了傑森的回答是:

var list = _.sortBy([{name:"Junior"},{name:"Senior"},{name:"Freshman"},{name:"Sophomore"}], function(element){ 
    var rank = { 
     "Junior" : 3, 
     "Senior" : 4, 
     "Freshman" :1, 
     "Sophomore" :2 
    }; 

    return rank[element.name]; 
}); 

console.dir(list); 

這將有助於排序對象

相關問題