JavaScript稳定排序问题
JavaScript stable sort issue
我已经在这个话题上寻找了一些帮助,但无法找到一些帮助或指导。我的问题是我正试图对一系列由等号分隔的值进行排序。
"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中实现了
相关文章:
- 使用Handontable在同一列中用纯文本和html对问题进行排序
- 应用了转换时的D3js排序问题
- Ember组件'jQuery可排序的模板问题
- 循环的JavaScript排序问题
- 对数组进行排序时出现问题
- Javascript中的多维数组排序索引问题
- jQuery拖动到相对位置的可排序列表中时出现可拖动辅助对象位置问题
- 问题以在webkit浏览器中对数组进行排序
- 关于使用jQuery对Div中的内容进行重新排序的问题
- MongoDB排序&极限问题
- 排序 JSON 时遇到问题
- 动态填充表时突出显示和排序问题
- 角度 js 中的日期表列排序问题
- 数组中的类型出现问题,并尝试将内容排序到表中
- 启动表排序器时遇到问题
- 我的排序方法(AJAX,PHP&MySQL)出了什么问题
- Knockout JS + JQuery UI - 在重新排序后从可观察数组中删除项目的问题
- 具有排序问题的流体动态图像布局
- 按相关性能问题排序
- 在IE9-10中使用sort()问题排序DOM元素