2016-08-04 87 views
2

我想使用JQuery或JavaScript按姓氏字母順序對全名進行排序,但在循環和分割中不斷丟失。誰能幫忙?以全名命名並按姓氏排序

var names = ["Adam Benson", "Clare Donaldson", "Ben Adams", "Donald Clarkson"]; 

感謝和抱歉,看起來像一個非常簡單的問題!

+1

運行。遠遠跑遠。名稱總是比它們看起來更復雜。是否有可能你會得到「Adam James Benson」(例如中間名)或「Adam Demby Benson」(例如兩個姓氏)或「Adam Charles Copernicus Smith Benson」(例如,誰知道)?如果你一定只有兩個名字,而且絕對是你想要的第二個名字,下面有答案可以解決這個問題。只是要小心實際的名稱數據。 – VoteyDisciple

+0

Pablo DiegoJoséFrancisco de Paula Juan NepomucenoMaríade los Remedios Cipriano de laSantísima特立尼達魯伊斯畢加索,更名爲巴勃羅畢加索 –

+0

@ VoteyDisciple是的,我希望我使用的數據有「名」,「名稱「,但你能做什麼?只是一個小練習,希望它不會成爲一個問題! – dedaumiersmith

回答

2

Array#sort幫忙做它,String#splitString#localeComapre方法。

var names = ["Adam Benson", "Clare Donaldson", "Ben Adams", "Donald Clarkson"]; 
 

 
// sort array with custom functions 
 
names.sort(function(a, b) { 
 
    // compare lastname part for sorting 
 
    return a.split(' ')[1].localeCompare(b.split(' ')[1]); 
 
}) 
 

 
console.log(names);

供參考:如果名稱包含然後中間名部分改變name.split(' ')[1]name.split(' ').pop()得到從陣列的最後一個元素(這是THW姓氏)。

+0

完美,謝謝! (爲了這一點,並提請我注意localeCompare) – dedaumiersmith

+0

@GilesTaylor:很高興幫助你:) –

+0

但會失敗,例如'阿爾伯託德索薩' –

2

您可以用sort()功能,通過空間分割值和過去的值進行比較的結果數組來實現這一目標:

var names = ["Adam Benson", "Clare Donaldson", "Ben Adams", "Donald Clarkson"]; 
 
names.sort(function(a, b) { 
 
    var aSurname = a.split(' ').pop(); 
 
    var bSurname = b.split(' ').pop(); 
 
    return aSurname < bSurname ? -1 : aSurname > bSurname ? 1 : 0; 
 
}) 
 

 
console.log(names);

您將可能還需要添加一些驗證在所提供的名稱中沒有空格的情況下將此代碼添加到此代碼中。

+0

感謝您的支持!這只是我正在做的一個小練習,但是要感謝關於驗證的頭腦。 – dedaumiersmith