JavaScript稳定排序问题

JavaScript stable sort issue

本文关键字:问题 排序 JavaScript      更新时间:2023-09-26

我已经在这个话题上寻找了一些帮助,但无法找到一些帮助或指导。我的问题是我正试图对一系列由等号分隔的值进行排序。

"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}

然而,我不确定如何最好地解决它。

直接排序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);
})

我会这样做:

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;
    }
}

看一下这个演示

这样做的原因会让您在将来想知道为什么。我想你应该是这样的:

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()));
}

2019更新

规范已经改变,#Array.prototype。Sort现在是稳定排序。

数组中的元素已排序。排序必须是稳定的是,比较相等的元素必须保持原来的顺序)

这已经在V8中实现了