JavaScript稳定排序问题

时间:2015-09-12 00:36:17

标签: javascript

我已经四处寻找有关此主题的帮助,但无法找到一些帮助或指导。 我的问题是我试图对由等号分隔的一系列值进行排序。

  

“Foo = Bar,Shenanigans = Fun,A = B ......等”

我当前的排序有效,但前提是没有相同的值。如果我有一些值,如:

  

“Foo = Bar,A = Bar,Potato = Bar”

当排序完成时,它们都将是“A = Bar”

我目前的排序看起来像这样,有人能指出我正确的方向吗?

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

我知道我的问题在于:valueArray [i] == oldValues [j] 当数据进入valueArray = {Bar,Foo,Bar}时,textArray = {Foo = Bar,A = Foo,Test = Bar}

但是,我不确定如何最好地解决它。

4 个答案:

答案 0 :(得分: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);
})

答案 1 :(得分: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

答案 2 :(得分: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()));
}

答案 3 :(得分:0)

更新2019

规范has changed#Array.prototype.sort现在是稳定的排序。

  

此数组的元素已排序。排序必须是稳定的(即   是,比较相等的元素必须保留其原始顺序)

这已经是implemented in V8