如何在JavaScript中对字符串进行排序

526

我有一个对象列表,希望按照类型为字符串的字段attr进行排序。我尝试使用-

list.sort(function (a, b) {
    return a.attr - b.attr
})

但是我发现在 JavaScript 中,- 似乎不能用于字符串。那么如何根据一个字符串类型的属性对对象列表进行排序呢?

但我发现JavaScript中-不能用于字符串。如何基于字符串类型的属性对对象列表进行排序?


1
请参考 https://dev59.com/IXI95IYBdhLWcg3wzhd9 中的 JavaScript 不区分大小写字符串比较。 - Adriano
对于快速的“国际化”解决方案(我猜只是部分,因为这可能无法涵盖世界上所有口音),您可能希望简单地忽略口音,也就是去掉它们。然后只进行字符串比较,请参见https://dev59.com/OnNA5IYBdhLWcg3wX8nk上的`Javascript:remove accents / diacritics in strings`。 - Adriano
2
有趣的是,Jeff Atwood本人在2007年写了一篇关于这个常见问题的博客文章,请参见http://blog.codinghorror.com/sorting-for-humans-natural-sort-order/。 - Adriano
这是一个非常古老的问题,所以如果你像我一样从未来看到这个问题,你应该在实施任何你在这里找到的建议之前,真正阅读关于性能的这个问题 - Coderer
16个回答

4

应该有升序和降序的函数。

if (order === 'asc') {
  return a.localeCompare(b);
}
return b.localeCompare(a);

4

使用sort()时不要加任何-<

const areas = ['hill', 'beach', 'desert', 'mountain']
console.log(areas.sort())

// To print in descending way
console.log(areas.sort().reverse())


['42', '2', '40', '44', '47', '12', '41', '13', '5', '9', '14', '6', '20', '25', '59', '46', '3', '4', '72', '52', '53', '21', '26', '54', '75', '57', '19', '22', '56', '17', '16', '60', '61', '64']排序无效。 - Viraj Singh
2
@VirajSingh 它可以工作。字符串比较不是数字比较。对于复杂数据(即:对象数组),它无法工作。 - Alexander Santos

0
list.sort(function(item1, item2){
    return +(item1.attr > item2.attr) || +(item1.attr === item2.attr) - 1;
}) 

它们的工作样例:

+('aaa'>'bbb')||+('aaa'==='bbb')-1
+(false)||+(false)-1
0||0-1
-1

+('bbb'>'aaa')||+('bbb'==='aaa')-1
+(true)||+(false)-1
1||0-1
1

+('aaa'>'aaa')||+('aaa'==='aaa')-1
+(false)||+(true)-1
0||1-1
0

4
仅提供代码的答案可以通过解释其工作原理来使其更有用。 - Dan Dascalescu

0
在你的初始问题中,你正在执行以下操作:
item1.attr - item2.attr

所以,假设这些是数字(即item1.attr =“1”,item2.attr =“2”),您仍然可以使用“ ===”运算符(或其他严格的评估器),前提是您确保类型。以下应该可以工作:

return parseInt(item1.attr) - parseInt(item2.attr);

如果它们是字母数字,则使用localCompare()。

-4
<!doctype html>
<html>
<body>
<p id = "myString">zyxtspqnmdba</p>
<p id = "orderedString"></p>
<script>
var myString = document.getElementById("myString").innerHTML;
orderString(myString);
function orderString(str) {
    var i = 0;
    var myArray = str.split("");
    while (i < str.length){
        var j = i + 1;
        while (j < str.length) {
            if (myArray[j] < myArray[i]){
                var temp = myArray[i];
                myArray[i] = myArray[j];
                myArray[j] = temp;
            }
            j++;
        }
        i++;
    }
    var newString = myArray.join("");
    document.getElementById("orderedString").innerHTML = newString;
}
</script>
</body>
</html>

2
请在您的答案中添加一些信息,说明这将如何解决问题。仅有代码的答案是不受欢迎的。谢谢。 - wayneOS
1
在这里,您想对字符串中的字符进行排序,但这不是所要求的。您可以使用“Array.sort”轻松实现此排序,例如 str.split("").sort().join("")。 - Alejadro Xalabarder

-4
var str = ['v','a','da','c','k','l']
var b = str.join('').split('').sort().reverse().join('')
console.log(b)

虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释,并指出适用的限制和假设。 - Dave
这个例子不起作用。如果您尝试拆分结果,最终会得到“da”分离的结果。 - Alexander Santos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接