Javascript 按字母顺序排序;如何将数值与数字进行比较,同时将它们与字符串进行比较?

标签 javascript jquery string sorting string-comparison

我有一个要在图表中显示的数据列表,并且我希望数据按字母顺序显示。当数据点都是单词(例如“白人”、“亚洲人”、“非裔美国人”)时,我的排序功能可以正常工作,但是当我的数据点包含数字(例如“1”、“10”、“<1”)时排序不能按我需要的方式进行。这是我的排序脚本:

var series = response.series;

series = series.sort(function(a, b) {
    var textA = a.name.toLowerCase();
    var textB = b.name.toLowerCase();
    console.log("Comparing " + textA + " to " + textB);
    var returnVal = (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
    console.log(returnVal);
    return returnVal;
});

我可以从控制台日志记录中看到比较似乎正确比较,但是当我在排序后再次检查系列时,它与之前相同。这是我的数据的更大示例:

series = [
    {name: "1"}
    {name: "10"}
    {name: "11"}
    {name: "12"}
    {name: "13"}
    {name: "2"}
    {name: "3"}
    {name: "4"}
    {name: "5"}
    {name: "6"}
    {name: "7"}
    {name: "8"}
    {name: "9"}
    {name: "<1"}
    {name: "Total 18 and below"}
]

最佳答案

我意识到这些值是作为字符串而不是数字进行比较的,在 Javascript 中,“123”位于“2”之前,就像“abc”位于“b”之前一样。我无法将整个数组转换为数字,因为它包含“<1”和“总计 18 及以下”​​,因此我编写了一个自定义比较方法:

series = series.sort(function(a, b) {
    var textA = a.name.toLowerCase();
    var textB = b.name.toLowerCase();

    // if we're comparing number to number, do number sorting
    if (!isNaN(textA) && !isNaN(textB)) {
        var numA = parseInt(textA);
        var numB = parseInt(textB);
        return (numA < numB) ? -1 : (numA > numB) ? 1 : 0;
    }

    // else sort as strings
    return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});

关于Javascript 按字母顺序排序;如何将数值与数字进行比较,同时将它们与字符串进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49657948/

相关文章:

javascript - 如何将变量作为参数传递给 cypher 查询 (neo4j)

javascript - 将 for 循环的索引传递给不同的函数

c - 无法打印 char* 字符串

javascript - 使用javascript regexp匹配日志文件尾

android - 使用不同的方法从资源访问外部字符串有什么区别?

c++ - stringstream、string 和 char* 转换混淆

javascript - Ionic 应用程序中的屏幕尺寸错误

javascript - 在 Node.js 中保存 XML 文件

javascript - React-Native DatePickerIOS minimumDate Prop

javascript - 使用 javascript($ajax) 从给定的 url 获取 html 文件