2014-02-26 22 views
1

基本上我有客戶名稱的數組已排序:添加字母排序字符到一個數組

Al K. Seltzer 
Alf A. Romeo 
Ali Gaither, Ali Katt 
Amber Green 
Cam Payne 
Cara Van 
Craven Moorehead 
Crystal Ball 
Crystal Claire Waters 
Ford Parker 
Forrest Green 
Foster Child 

我要添加排序字符:

**A** 
Al K. Seltzer 
Alf A. Romeo 
Ali Gaither, Ali Katt 
Amber Green 
**C** 
Cam Payne 
Cara Van 
Craven Moorehead 
Crystal Ball 
Crystal Claire Waters 
**F** 
Ford Parker 
Forrest Green 
Foster Child 

我目前的計算策略:

function addSortigChars(elements) { 
    var lastChar=elements[0].LastName.substring(0,1).toUpperCase(); 
    var newArray=[]; 
    newArray.push(lastChar); 
    for(var i=0;i<elements.length;i++) { 
     var newChar=elements[i].LastName.substring(0,1).toUpperCase(); 
     if(newChar!=lastChar) { 
     lastChar=newChar; 
     newArray.push(lastChar); 
     } 
     newArray.push(elements[i]); 
    } 
    return(newArray); 
} 

我認爲遍歷每個元素是非常低效的。有沒有任何有效的方法來做到這一點?

我使用敲除來綁定到DOM。有沒有可以幫助我的ko中的buildin-function?

回答

1

你說得對,每個元素都不是最有效的解決方案,但我認爲優化它的性能好處不值得增加複雜性。

不過,如果你真的想優化它,你可以!您可以通過設置每個字母的條目數量來估計,例如,如果您有1000個元素,則可以估計以A開頭的名稱將大約爲100. 然後,您可以使用二進制搜索的版本找到以B開頭的名字,範圍爲0到200.請記住,200是一個軟限制,如果您的估計非常糟糕,並且100到200之間的所有名稱都以A開頭,那麼您需要考慮去過去它。事實上,我會使用最大值(估計+最大值已知A),並在發現更大的A時更新它。 一旦你這樣做,找到第一個B ===你必須插入的地方B,然後你轉到下一個字母。

通過使用(修改)二進制搜索,可以保證跳過大多數元素。效率部分取決於您估算的準確性。

祝你好運!


一個清潔的執行原來的算法,從而改變陣列中的地方:

function addSortingChars(elements) { 
    var last = ''; 
    for (var i=0; i<elements.length; i++) { 
    if (elements[i][0].toUpperCase() !== last) { 
     last = elements[i][0].toUpperCase(); 
     elements.splice(i, 0, last); 
    } 
    } 
} 
-1

您可以向後遍歷你的數組! demo

var mem = arr[arr.length-1].substring(0,1).toUpperCase(); // memorize: "F"  
for(var i=arr.length-1; i>-1; --i){ 
    var fc = arr[i].substring(0,1).toUpperCase();   // first character 
    if(mem!=fc || !i){ 
    arr.splice(!i?0:i+1, 0, "***"+mem+"***"); 
    mem = fc; 
    } 
} 
如果您登錄

arr

["***A***", "Al K. Seltzer", "Alf A. Romeo", "Ali Gaither, Ali Katt", "Amber Green", "***C***", "Cam Payne", "Cara Van", "Craven Moorehead", "Crystal Ball", "Crystal Claire Waters", "***F***", "Ford Parker", "Forrest Green", "Foster Child"] 
+0

爲什麼downvote?代碼正在工作。 – Tibos