如何正确使用字段对数组进行排序

时间:2019-04-23 13:23:49

标签: javascript arrays sorting

我有一个数组,我想对数组中的字段进行排序,但无法正常工作

var data = [{tm: "09:00", tr: "30.34", rd: "73.23"},
{tm: "09:10", tr: "30.45", rd: "70.77"},
{tm: "09:50", tr: "29.95", rd: "75.70"},
{tm: "09:40", tr: "29.95", rd: "75.70"},
{tm: "01:50", tr: "29.95", rd: "75.70"},
{tm: "02:30", tr: "29.95", rd: "75.70"},
{tm: "04:50", tr: "29.95", rd: "75.70"},
{tm: "10:00", tr: "30.05", rd: "76.20"}];

我需要使用tm字段对其进行排序,以便排序后数据将采用这种格式

0 tm: 01.50
1 tm: 02.30
2 tm: 04.50
3 tm: 09.00
4 tm: 09.10
5 tm: 09.40
6 tm: 09.50
7 tm: 10.00

我尝试过

data.sort(function(a, b){return a.tm - b.tm});

它不起作用任何帮助将不胜感激,谢谢

3 个答案:

答案 0 :(得分:3)

HH:MM本质上可以排序,因此传递给localeCompare将按预期工作。

var data = [{tm: "09:00", tr: "30.34", rd: "73.23"},
{tm: "09:10", tr: "30.45", rd: "70.77"},
{tm: "09:50", tr: "29.95", rd: "75.70"},
{tm: "09:40", tr: "29.95", rd: "75.70"},
{tm: "01:50", tr: "29.95", rd: "75.70"},
{tm: "02:30", tr: "29.95", rd: "75.70"},
{tm: "04:50", tr: "29.95", rd: "75.70"},
{tm: "10:00", tr: "30.05", rd: "76.20"}];

data.sort((a, b) => a.tm.localeCompare(b.tm));

console.log(data)

答案 1 :(得分:2)

如果

a.tm - b.tm是数字,则可以使用。由于它们之间有:,因此"09:10" - "09:50"返回NaN

因此,您可以replace :并仅获取数字,然后减去tm

var data = [
    { tm: "09:00", tr: "30.34", rd: "73.23" },
    { tm: "09:10", tr: "30.45", rd: "70.77" },
    { tm: "09:50", tr: "29.95", rd: "75.70" },
    { tm: "09:40", tr: "29.95", rd: "75.70" },
    { tm: "01:50", tr: "29.95", rd: "75.70" },
    { tm: "02:30", tr: "29.95", rd: "75.70" },
    { tm: "04:50", tr: "29.95", rd: "75.70" },
    { tm: "10:00", tr: "30.05", rd: "76.20" }
  ];

data.sort((a, b) => +a.tm.replace(":", '') - +b.tm.replace(":", ''))

console.log(data)

答案 2 :(得分:0)

您不能减去字符串,但是可以比较是否大于字符串。

您可以使用<><=>=进行排序:

var data = [{ tm: "09:00", tr: "30.34", rd: "73.23" },
    { tm: "09:10", tr: "30.45", rd: "70.77" },
    { tm: "09:50", tr: "29.95", rd: "75.70" },
    { tm: "09:40", tr: "29.95", rd: "75.70" },
    { tm: "01:50", tr: "29.95", rd: "75.70" },
    { tm: "02:30", tr: "29.95", rd: "75.70" },
    { tm: "04:50", tr: "29.95", rd: "75.70" },
    { tm: "10:00", tr: "30.05", rd: "76.20" }];
var d = data.sort(function (a, b) { return a.tm > b.tm; });
console.log(d);

回应有关布尔比较的评论

一种更好的比较方法是在numeric模式下使用localeCompare来比较值:

var data = [{ tm: "09:00", tr: "30.34", rd: "73.23" },
    { tm: "09:10", tr: "30.45", rd: "70.77" },
    { tm: "09:50", tr: "29.95", rd: "75.70" },
    { tm: "09:40", tr: "29.95", rd: "75.70" },
    { tm: "01:50", tr: "29.95", rd: "75.70" },
    { tm: "02:30", tr: "29.95", rd: "75.70" },
    { tm: "04:50", tr: "29.95", rd: "75.70" },
    { tm: "10:00", tr: "30.05", rd: "76.20" }];
var d = data.sort(function (a, b) { return a.tm.localeCompare(b.tm, undefined, { numeric: true }); });
console.log(d);

回应有关数字语言环境比较的评论

数字localeCompare对以0开头的数字也很有用:

var data = ["01", "10", "02"];
console.log({
    original: data,
    sorted: data.slice(0).sort(function (a, b) { return a.localeCompare(b, undefined, { numeric: true }); })
});