我有一个要在图表中显示的数据列表,并且我希望数据按字母顺序显示。当数据点都是单词(例如“白人”、“亚洲人”、“非裔美国人”)时,我的排序功能可以正常工作,但是当我的数据点包含数字(例如“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/