Вам нужно проверить, можно ли преобразовать значение в тип даты / времени, а затем вернуть -1 или 1 (в зависимости от того, где вы хотите, чтобы они находились), если они не совпадают.
json = ['01-01-2018', '', '04-03-2018', '03-03-2018', '', '04-03-2018', '03-03-2018'];
this.json.sort((obj1: string, obj2: string) => {
if (obj1 === obj2) { return 0; } // if they are the same then no need to convert these instances to Date types later, just return 0
if (!obj1) { return 1; } // thruthy check
if (!obj2) { return -1; } // thruthy check
if (new Date(obj1) > new Date(obj2)) { return 1; }
if (new Date(obj1) < new Date(obj2)) { return -1; }
return 0;
});
stackblitz
// Initial array
'01-01-2018', '', '', '', '04-03-2018', '03-03-2018', '', '04-03-2018', '03-03-2018'
// Sorted array
'01-01-2018', '03-03-2018', '03-03-2018', '04-03-2018', '04-03-2018', '', '', '', ''
На заметку о стороне я рекомендую momentjs вместо Date
в javascript. Он намного мощнее, и вы можете включить строку формата в значение, которое вы передаете, чтобы строка была правильно проанализирована.