我有一个数组我想用数组中的字段排序但是它没有用
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});
它不工作任何帮助将不胜感激谢谢
如果他们是数字,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)
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)
你不能减去一个字符串,但你可以比较它是否大于。
您可以使用<
,>
,<=
或>=
进行排序:
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);
回应关于布尔比较的评论
一个更好的比较方法是在localeCompare模式下使用numeric
来比较值:
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
为前缀的数字,数字localeCompare也很有用:
var data = ["01", "10", "02"];
console.log({
original: data,
sorted: data.slice(0).sort(function (a, b) { return a.localeCompare(b, undefined, { numeric: true }); })
});