2017-02-10 13 views
0
[09.02.2017 - 10:40:06][NOTICE] - Start looping through invoices from Teamleader.. 
[08.02.2017 - 10:24:26][NOTICE] - Start looping through invoices from Teamleader.. 
[08.02.2017 - 10:29:24][NOTICE] - Start looping through invoices from Teamleader.. 

Это код для получения вышеупомянутого выхода:JS: сортировать массив по дате и времени

var data = allText.split("\n"); 
for(var i = 0, len = data.length; i < len; i++){ 
    console.log(data[i]); 
} 

Можно сортировать массив на определенную дату и время?

вот пример того, как это должно выглядеть следующим образом:

[09.02.2017 - 10:40:06][NOTICE] - Start looping through invoices from Teamleader.. 
[08.02.2017 - 10:29:25][NOTICE] - Start looping through invoices from Teamleader.. 
[08.02.2017 - 10:24:26][NOTICE] - Start looping through invoices from Teamleader.. 

ответ

3

На момент написания настоящего документа другие решения либо не были полными, либо содержат ошибки. В частности, accepted answer by rakwaht сортирует даты как строки, что дает неверные результаты.

Вы можете использовать регулярное выражение и конструктор для извлечения и анализа даты из строки. Оттуда это только вопрос сортировки массива, содержащего строки:

const data = ` 
 
[09.02.2017 - 10:40:06][NOTICE] - Start looping through invoices from Teamleader.. 
 
[08.02.2017 - 10:24:26][NOTICE] - Start looping through invoices from Teamleader.. 
 
[08.02.2017 - 10:29:24][NOTICE] - Start looping through invoices from Teamleader..` 
 
    .trim().split('\n') 
 

 
function dateFromLine(line) { 
 
    const result = /^\[(.*?)\]/.exec(line) 
 
    const date = result[1].replace("-", "") 
 
    return new Date(date) 
 
} 
 

 
function compareLinesByDate(a, b) { 
 
    return dateFromLine(b) - dateFromLine(a) 
 
} 
 

 
data.sort(compareLinesByDate) 
 
console.log(data.join('\n'))

Обратите внимание, что этот код предполагает, что каждая строка форматируется таким образом. Необходима еще одна работа, чтобы сделать ее более надежной.

+0

Я был немного взволнован и принял другой ответ, пока вы набирали это. Если я проверяю, если typeof result === 'array' (dateFromLine (строка)), код не сбой, когда он передает другую строку, не так ли? –

+0

Выполнение только в том случае, если 'result' - это массив, который должен предотвращать ошибки во время выполнения, но вам все равно придется решать, как обрабатывать эти неверные строки. Другое дело иметь в виду, что для некоторых строк 'result [1]' может существовать, но не быть допустимой датой, например. для строки '[foo] [NOTICE] - Начать цикл через счета-фактуры от Teamleader..'. – csm

+0

Определенно ваш лучший подход, потому что более логично вписывается в логику. В любом случае, когда мое решение будет давать неправильные решения? Очевидно, я предположил, что строки хорошо отформатированы и имеют одинаковый шаблон. – rakwaht

0

Вы можете использовать функцию sort() в массиве с помощью функции comparaison сравнить дату. Я не знаю, что вы пытаетесь сравнить, но вот простой пример.

[/*...*/].sort(function(a, b){ 
    //here a and b stand for your dates. you will need to adjuste your code to make it works since we have very little information about it. 
    return Date.compare(a, b); 
}); 
1

Вы можете отсортировать массив, как вы хотите с помощью функции сортировки, в котором можно указать, на базе которого он должен быть отсортирован:

Вот пример, который будет соответствовать вашим потребностям:

var data = [ 
 
"[09.02.2017 - 10:40:06][NOTICE] - Start looping through invoices from Teamleader]", 
 
"[08.02.2017 - 10:24:26][NOTICE] - Start looping through invoices from Teamleader]", 
 
"[08.02.2017 - 10:29:24][NOTICE] - Start looping through invoices from Teamleader]" 
 
]; 
 
data.sort(
 
    function(a, b){ 
 
     // a and b are two elements in the list that are supposed to be compared 
 
     var a_date = a.substring(1, 22); //take only date from string 
 
     var b_date = b.substring(1, 22); //take only date from string 
 
     // We compare those strings to order it. 
 
     if (a_date < b_date) 
 
      return 1; 
 
     if (a_date > b_date ) 
 
      return -1; 
 
     return 0; 
 
    } 
 
); 
 
console.log(data);

here вы можете найти некоторые ссылки на функции сортировки в JS

+0

Получаю, спасибо! –

0

Ну, если я должен был сделать это, я бы превратить его в реальном массиве затем использовать функцию следующим образом:

function SortByDate(a, b){ 
    var aDateField = a.DateField.toLowerCase(); 
    var bDateField = b.DateField.toLowerCase(); 
    return ((aDateField < bNDateField) ? -1 : ((aDateField > bDateField) ? 1 : 0)); 
} 

var data = allText.split("\n"); 
for(var i = 0, len = data.length; i < len; i++){ 
    //construct your array_data here 
} 
var dataSortByDate = array_data.sort(SortByDate); 

Это одна из функции comparaison я использовал часто. Надеюсь, это поможет.