【问题标题】:Sort a list alphabetically with characters at the end按字母顺序对列表进行排序,最后有字符
【发布时间】:2015-10-30 09:39:41
【问题描述】:

我需要按角度按字母顺序(升序)对列表进行排序,但如果有任何前缀的特殊字符被推到列表的末尾,我希望它。 例如:列表应该是:

Apple
Banana
*Apple

任何建议都会被推荐。

【问题讨论】:

  • 不是重复的,但不是很远......
  • 只需使用sort()回调函数并在以特殊字符开头的字符串上添加z,检查我的答案。
  • @AndyRay thnxx 的糟糕解决方案 :)

标签: javascript jquery angularjs


【解决方案1】:

这是一个相当简单的解决方案。手动比较字符串时,最好使用localeCompare,即使用户的语言特定区域设置不同的排序顺序,它也会正确排序。但仅凭这个功能并不能解决我们的问题。在@wZVanG 的聪明答案之上,我们将使用\W 正则表达式字符组替换任何非单词字符,在字符串的开头使用字母z,这将自动将它们排序到末尾列表。

请注意其中的一个缺陷是,如果您的任何单词以多个z 开头,它们将排在特殊字符之后。一个简单的解决方法是在字符串中添加更多zs,如return a.replace(/^\W+/, 'zzz').localeCompare(b.replace(/^\W+/, 'zzz')

var array = ["Banana", "Apple", "*Canana", "Blackberry", "Banana", "*Banana", "*Apple"];

array.sort(function(a,b) {
    return a.replace(/^\W+/, 'z').localeCompare(b.replace(/^\W+/, 'z'));
});

【讨论】:

  • 注意\W 也将使用下划线_ 并将按_Apple, Banana, *Apple 排序。你可能想/^[^a-z]+/i
  • 我在用python而不是java对列表进行排序时遇到了类似的问题。将@AndyRay 提供的解决方案改编为python 语法解决了我的问题。
【解决方案2】:

这可能不正确,但这是我目前能想到的最好的。

DEMO

var array = ["Apple", "Banana", "*Apple"];

// Split the arrays with and without special chars
var alphaNumeric = array.filter(function (val) {
    return !(/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(val));
});
var specialChars = array.filter(function (val) {
    return /[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(val);
});

console.log(alphaNumeric, specialChars);

// Sort them individually
alphaNumeric.sort();
specialChars.sort();

// Bring them back together but put the special characters one afterwards
var both = alphaNumeric.concat(specialChars);

console.log(both);

【讨论】:

  • 工作..虽然不是理想的,但对我来说是这样,谢谢:)
【解决方案3】:
var list = ["Apple","Orange", "Banana", "*Banana","*Apple"];
regex= /^[A-z]+$/;
dummyArray1=[];
dummyArray2=[];
for(var i =0;i< list.length; i++){

    if(regex.test(list[i][0])){
    dummyArray1.push(list[i]);
    }
    else{
    dummyArray2.push(list[i]);
    }
}

console.log(dummyArray1.sort());
console.log(dummyArray2.sort());
console.log(dummyArray1.concat(dummyArray2));

【讨论】:

    【解决方案4】:

    一行:

    var sorted = ["Banana", "Apple", "*Canana", "Blackberry", "/Banana", "*Banana", "*Apple"]
    .sort(function(a, b, r){
       return r = /^[a-z]/i, (r.test(a) ? a : "z" + a) > (r.test(b) ? b : "z" + b)
    });
    
    
    //Test
    document.write(sorted.join("<br />"));

    如果项目不以字母开头,请添加Z

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 2013-05-02
      • 2014-02-08
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多