【问题标题】:JS: sort array on date and timeJS:按日期和时间对数组进行排序
【发布时间】:2017-02-10 13:27:51
【问题描述】:
[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..

这是产生上述输出的代码:

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..

【问题讨论】:

    标签: javascript arrays sorting date time


    【解决方案1】:

    在撰写本文时,其他解决方案要么不完整,要么包含错误。特别是,accepted answer by rakwaht 将日期排序为字符串,这会给出不正确的结果。

    您可以使用正则表达式和Date 构造函数从一行中提取和解析日期。从那里只需对包含行的数组进行排序:

    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'))

    请注意,此代码假定每一行都以这种方式格式化。需要做更多的工作才能使其更健壮。

    【讨论】:

    • 我有点太兴奋了,在你打字的时候接受了另一个答案。如果我检查 typeof result === 'array' (dateFromLine(line)),当它传递不同的字符串时,代码不会失败,对吧?
    • 只有在result 是一个数组的情况下继续进行才能防止运行时错误,但您仍然必须决定如何处理这些格式错误的行。要记住的另一件事是,对于某些行 result[1] 可能存在但不是有效日期,例如对于[foo][NOTICE] - Start looping through invoices from Teamleader.. 行。
    • 当然你的方法更好,因为它更符合逻辑。无论如何,我的解决方案什么时候应该给出错误的解决方案?显然,我假设这些字符串都是格式正确的,并且都具有相同的模式。
    • @rakwaht JavaScript 中的字符串是按字典顺序比较的,这意味着从头到尾比较每个字符串中相同位置的字符,直到确定哪个字符串大于另一个(或两个相等)。但是,在比较日期时,我们希望先按年进行比较,然后按月进行比较,然后按日进行,以此类推。
    • @rakwaht 以 [09.02.2017 - 10:40:06][08.02.2027 - 10:40:06] 为例:作为日期比较,[09.02.2017 - 10:40:06] 应该在 [08.02.2027 - 10:40:06] 之前(因为 2017 年在 2027 年之前),但是当作为字符串比较时,它是其他方式(因为“08”在“09”之前)。
    【解决方案2】:

    您可以使用 sort 函数根据需要对数组进行排序,您可以在其中指定应根据哪个基对数组进行排序:

    这里有一个适合您需要的示例:

    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中sort函数的引用

    【讨论】:

      【解决方案3】:

      您可以在数组上使用函数sort() 和比较函数来比较日期。我不知道您要比较什么,但这是一个简单的示例。

      [/*...*/].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);
      });
      

      【讨论】:

        【解决方案4】:

        好吧,如果我必须这样做,我会将它转换为一个真正的数组,然后使用这样的函数:

        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);
        

        这是我经常使用的比较功能之一。希望它会有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-19
          • 1970-01-01
          • 1970-01-01
          • 2020-02-29
          • 2017-06-13
          • 2022-01-14
          • 2020-03-16
          • 1970-01-01
          相关资源
          最近更新 更多