Отсортировать массив по дате
Имею массив ar1, каждый элемент которого условно состоит из двух частей: 'msg' и 13_цифр - дата
ar1 = ["msg1601026412879","msg1601026416879","msg1601026415879","msg1601026414879","msg1601026413879"];
если хочу отсортировать по этой дате, то делаю так:
let tst = [];
for (let i = 0; i < ar1.length; i++) {tst.push(Number(ar1[i].slice(3)));};
tst.sort(function (a, b) { return a - b; }); // здесь сортирую цифры по возрастанию;
ar1.length = 0;
for (let i = 0; i < tst.length; i++) {ar1.push('msg'+tst[i]);};
Получаю отсортированный по дате:
alert(ar1);
Как сделать правильно и максимально быстро (для большого числа элементов), если массив имеет вид:
ar2 = ["msg74185231601026412879","msg36547891601026416879","msg85296471601026415879","msg98752141601026414879","msg75315981601026413879"];
т.е. для ar2, каждый элемент которого состоит из трёх частей: 'msg' + 'рандом_7_цифр' + 13_цифр - дата?
UPD01: делал через объект, так:
ar1 = ["msg74185231601026412879","msg36547891601026416879","msg85296471601026415879","msg98752141601026414879","msg75315981601026413879"];
let tst = [];
let tmt = {};
for (let i = 0; i < ar1.length; i++) {
tst.push(Number(ar1[i].slice(10)));
tmt[tst[i]] = ar1[i];
}
tst.sort(function (a, b) { return a - b; }); // здесь сортирую цифры по возрастанию;
ar1.length = 0;
for (let i = 0; i < tst.length; i++) {
ar1.push(tmt[tst[i]]);
}
alert(ar1);
Ответы (2 шт):
У вас массив фиксированного формата (размера и структуры), поэтому не парьтесь и сравнивайте по строкам:
т.е. у вас каждый элемент называется msg***********************
а раз так, то полностью применимо обычное сравнение строк, в противном случае надо было бы выделять конечно целочисленные части и т.д.
Typescript:
let ar2: Array<string> = ar1.sort((a: string, b: string) => a.localeCompare(b));
Javascipt:
let ar2 = ar1.sort((a, b) => a.localeCompare(b));
let ar2 = ["msg74185231601026412879","msg36547891601026416879","msg85296471601026415879","msg98752141601026414879","msg75315981601026413879"];
ar2.sort((a, b) => a.slice(10) - b.slice(10));
console.log(ar2);