2015-09-12 119 views
0

我查看了一些關於此主題的幫助,但無法找到一些幫助或指導。 我的問題是我試圖執行一系列由等號分隔的值。JavaScript穩定排序問題

「富=酒吧,惡作劇=樂趣,A = B ...等等」

我目前的排序工作,但前提是沒有價值是一樣的。如果我有這樣一些值:

「富=酒吧,A =酒吧,土豆=酒吧」

當排序完成後,他們都將是 「A =酒吧」

我目前的排序是這樣的,有人能夠指出我正確的方向嗎?

$('#sortByValue').click(function() { 
 
\t var textValueArray = document.getElementById('nameValuePairList'); 
 
\t textArray = new Array(); 
 
\t valueArray = new Array(); 
 
\t oldValues = new Array(); 
 
\t for (i = 0; i < textValueArray.length; i++) { 
 
\t \t valueArray[i] = textValueArray.options[i].value; 
 
\t \t textArray[i] = textValueArray.options[i].text; 
 
\t \t oldValues[i] = textValueArray.options[i].value; 
 
\t } 
 
\t valueArray.sort(function(a, b) { 
 
\t \t return a.toLowerCase().localeCompare(b.toLowerCase()); 
 
\t }); 
 
\t for (i = 0; i < textValueArray.length; i++) { 
 
\t \t textValueArray.options[i].value = valueArray[i]; 
 
\t \t for (j = 0; j < textValueArray.length; j++) { 
 
\t \t \t if (valueArray[i] == oldValues[j]) { 
 
\t \t \t \t textValueArray.options[i].text = textArray[j]; 
 
\t \t \t \t j = textValueArray.length; 
 
\t \t \t } 
 
\t \t } 
 
\t } 
 
});

我知道,我的問題就出在這裏:valueArray [I] == oldValues [J] 當數據進入valueArray = {酒吧,美孚,酒吧}而textArray =爲{Foo = Bar,A = Foo,Test = Bar}

但是,我不確定如何最好地解決它。

+0

你想要的結果是什麼? – PHPglue

+0

對於{A = C,測試=酒吧,代碼=有趣,Foo =酒吧}的輸入 完成的排序應該看起來像。 {Foo = Bar,Test = Bar,A = C,Code = Fun} 它應該按'='符號右側的內容進行升序排序。 – OddBall

+0

爲什麼你想要創建這個?這是可行的,但真的。 – PHPglue

回答

0

排序textArray直接,不使用valueArray因爲它會包含重複:

textArray.sort(function(a,b){ 
    var aa = a.split('=') 
    var bb = b.split('=') 

    var a_key = aa[0].toLowerCase(), a_val = aa[1].toLowerCase(); 
    var b_key = bb[0].toLowerCase(), b_val = bb[1].toLowerCase(); 

    if (a_val == b_val) return a_key.localeCompare(b_key); 

    return a_val.localeCompare(b_val); 
}) 
0

我會做這樣的事情:

document.getElementById('sortByName').onclick = sortByName; 
function sortByName(){ 
    var myList = document.getElementById('list'); 
    var values = []; 
    for (var i=0;i<myList.options.length;i++) { 
     values[i] = myList.options[i].text; 
    } 
     values.sort(function (a, b){ 
      if(a !== "" && b !== ""){ 
       return a.split('=')[0].localeCompare(b.split('=')[0]); 
      } else { 
       return 0; 
      } 
     }); 
    clearList(myList); 

    fillList(myList, values); 
} 

function clearList(list) { 
    while (list.options.length > 0) { 
     list.options[0] = null; 
    } 
} 

function fillList(myList, values){ 
    for (var i=0;i<values.length;i++) { 
     var option = document.createElement("option"); 
     option.text = values[i]; 
     myList.options[i] = option; 
    } 
} 

看看這個demo

0

做這件事背後的理由將讓你想知道爲什麼,在未來。我想你想要的東西是這樣的:

function inArray(v, a){ 
    for(var i=0,l=a.length; i<l; i++){ 
    if(a[i] === v){ 
     return true; 
    } 
    } 
    return false; 
} 
function sortWeirdString(str){ 
    var pairs = str.split(/\s?,\s?/), n = [], v = [], c = [], ci, idx = [], cl, nv = [], ra = []; 
    for(var i=0,l=pairs.length; i<l; i++){ 
    var pair = pairs[i].split(/\s?=\s?/); 
    n.push(pair[0]); v.push(pair[1]); 
    } 
    c = n.concat().sort(); cl = c.length 
    for(var i=0; i<cl; i++){ 
    var cv = c[i]; 
    if(n.indexOf){ 
     ci = n.indexOf(cv); 
     if(inArray(ci, idx)){ 
     ci = n.indexOf(cv, ci+1); 
     } 
     idx.push(ci); 
    } 
    else{ 
     for(var x=0; x<cl; x++){ 
     if(n[x] === cv){ 
      if(inArray(x, idx)){ 
      continue; 
      } 
      idx.push(x); 
     } 
     } 
    } 
    } 
    for(var i=0,l=idx.length; i<l; i++){ 
    ra.push(c[i]+'='+v[idx[i]]); 
    } 
    return ra.join(', '); 
} 
$('#sortByValue').click(function(){ 
    console.log(sortWeirdString($('#nameValuePairList').val())); 
}