2016-08-20 18 views
4

排序和格式姓氏我有一個數組moonwalkers並寫了一個函數alphabetizer以字母順序排序的名稱,並先用姓氏格式化。如何在按字母順序排列在JavaScript

它工作正常,但我怎麼寫更好的代碼?

我用這個article by Hubrik並提到Stack Overflow瞭解如何排序在JS工作。

我試圖返工compare功能到last name變量和用它製成的一團糟。我懷疑這是因爲我仍然試圖讓我的頭在範圍和提升。

var moonWalkers = [ 
 
    "Neil Armstrong", 
 
    "Buzz Aldrin", 
 
    "Pete Conrad", 
 
    "Alan Bean", 
 
    "Alan Shepard", 
 
    "Edgar Mitchell", 
 
    "David Scott", 
 
    "James Irwin", 
 
    "John Young", 
 
    "Charles Duke", 
 
    "Eugene Cernan", 
 
    "Harrison Schmitt" 
 
]; 
 

 

 
var finalNameList = []; 
 

 
function alphabetizer(names) { 
 
    
 
    // compare last names 
 
    function compare (a, b) { 
 
     var aName = a.split(" "); 
 
     var bName = b.split(" "); 
 
     var aLastName = aName[aName.length - 1]; 
 
     var bLastName = bName[bName.length - 1]; 
 
     
 
     if (aLastName < bLastName) return -1; 
 
     if (aLastName > bLastName) return 1; 
 
     return 0; 
 
    } 
 
    
 
    names.sort(compare); 
 
    
 
    // to format names 
 
    for (i = 0; i < names.length; i++) { 
 
     var lastName = names[i].split(" ")[1]; 
 
     var firstName = names[i].split(" ")[0]; 
 
     var newName = lastName + ", " + firstName; 
 
     
 
     // push newName to global var finalNameList 
 
     finalNameList.push(newName); 
 
    } 
 
    
 
    return finalNameList; 
 
} 
 

 
console.log(alphabetizer(moonWalkers));

+0

您的排序回調的身體可以縮短到'回報a.split( 「 」)[1] .localeCompare(b.split(「」)[1]);' - 或之前格式化名稱*排序,你可以直接'返回finalNameList.sort();' – nnnnnn

+0

謝謝@nnnnnn – dho

回答

1

這種方法並不理想,因爲它只是比較姓氏。姓氏相同的人不會按照姓氏排序。

試試這個:

var moonWalkers = [ 
 
    "Neil Armstrong", 
 
    "Buzz Aldrin", 
 
    "Pete Conrad", 
 
    "Alan Bean", 
 
    "Alan Shepard", 
 
    "Edgar Mitchell", 
 
    "David Scott", 
 
    "James Irwin", 
 
    "John Young", 
 
    "Charles Duke", 
 
    "Eugene Cernan", 
 
    "Harrison Schmitt" 
 
]; 
 

 
function alphabetizer(names) { 
 
    var list = []; 
 

 
    // format names first 
 
    for (i = 0; i < names.length; i++) { 
 
     var lastName = names[i].split(" ")[1]; 
 
     var firstName = names[i].split(" ")[0]; 
 
     var newName = lastName + ", " + firstName; 
 
     
 
     // push newName to global var finalNameList 
 
     list.push(newName); 
 
    } 
 

 
    // compare entire name 
 
    return list.sort(); 
 
} 
 

 
console.log(alphabetizer(moonWalkers));


更新:該版本將包括中,或者在結果的暱稱。如果名稱包含諸如「Jr」或「Esq」之類的後綴,它將無法按預期工作。

var moonWalkers = [ 
 
    "Neil Armstrong", 
 
    "Edwin \"Buzz\" Aldrin", 
 
    "Charles \"Pete\" Conrad", 
 
    "Alan Bean", 
 
    "Alan Shepard", 
 
    "Edgar Mitchell", 
 
    "David Scott", 
 
    "James Irwin", 
 
    "John Young", 
 
    "Charles Duke", 
 
    "Eugene Cernan", 
 
    "Harrison \"Jack\" Schmitt" 
 
]; 
 

 
function alphabetizer(names) { 
 
    return names.map(function(name) { 
 
    var full = name.split(" "), 
 
     last = full.pop(); 
 
    return last + ", " + full.join(" "); 
 
    }).sort(); 
 
} 
 

 
console.log(alphabetizer(moonWalkers));

+0

非常感謝@Mottie。 – dho

+0

@dho,Mottie,'function alphabetizer(names){ return names.map(function(name){ var [firstName,lastName] = name.split(「」); return lastName +「,」+ firstName; })。sort(); }' – Thomas

+0

謝謝@Thomas,實際上我已經更新了我的答案,其中不僅包括姓氏和名字。 – Mottie