Как правильно использовать поле для сортировки моего массива - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть массив, который я хочу сортировать с полем в массиве, но он не работает

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 ]

3 голосов
/ 23 апреля 2019

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)
2 голосов
/ 23 апреля 2019

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)
0 голосов
/ 23 апреля 2019

Вы не можете вычесть строку, но вы можете сравнить, если она больше, чем.

Вы можете сортировать, используя <, >, <= или >=:

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

Числовое значение 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 }); })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...