2016-08-04 50 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