【问题标题】:How to filter date using javaScript?如何使用 JavaScript 过滤日期?
【发布时间】:2019-02-20 08:50:43
【问题描述】:

我正在创建一份 HTML 报告,该报告必须根据日期选择显示订单详细信息。存储在 JSON 文件中的订单详情如下:

[
  {
    "storeName": "ireland",
    "langCode": "en_IE",
    "testCaseName": "Guest User Checkout - Credit Card",
    "orderID": "4001820209",
    "date": "12-02-2019 15:37:30.201",
    "cartTotal": "19.98"
  },
  {
    "storeName": "denmark",
    "langCode": "en_DK",
    "testCaseName": "Guest User Checkout - Credit Card",
    "orderID": "6001825084",
    "date": "12-02-2019 15:37:35.140",
    "cartTotal": "338 DKK"
  },
  {
    "storeName": "united_kingdom",
    "langCode": "en_GB",
    "testCaseName": "Guest User Checkout - Credit Card",
    "orderID": "7002541022",
    "date": "13-02-2019 15:45:08.038",
    "cartTotal": "13.04"
  }
]

HTML 报告将如下所示:

我想从这个 JSON 文件中唯一地获取所有订单日期。需要删除时间,如果相同的日期已经添加到 HTML 中,则跳过它。 HTML 上的预期日期顺序应为:

  • 12-02-2019
  • 13-02-2019
  • 14-02-2019

如果用户点击该特定日期,则应显示该日期下的所有订单。

我在下面编写了 jQuery/javascript 函数来读取日期并添加到 html 中,但不知道如何使它们独一无二。

这将在页面加载时调用

function myFunction() {
    createList();
    $.getJSON('order-detail.json', function (item) {
        item.forEach(function (data) {
                addItemsInList(data);
        });
    });
}

创建无序列表

function createList() {

    var ul = document.createElement('ul');
    ul.setAttribute('id', 'order-dates');

    var div = document.getElementById('orderDateContainer');
    div.appendChild(ul);
}

在列表中添加日期

function addItemsInList(data){

    var ul = document.getElementById('order-dates');
    li = document.createElement('li');
    li.setAttribute('class', 'ord-date');
    ul.appendChild(li);
    var a = document.createElement('a');
    a.setAttribute('class', 'record-viewer');
    a.setAttribute('href','#recordContent');
    a.innerHTML=data.date;
    a.setAttribute('onclick','tableCreater()');
    li.appendChild(a);
}

任何帮助将不胜感激。

【问题讨论】:

  • 独特是什么意思?
  • 日期应该显示为12-02-2019 然后13-02-2019 等等。时间应该被删除
  • 啊..我看到了问题,您为每个元素分配了相同的 id,而 id 表示唯一。因此,将 id 分配为“order-dates”+ index,然后使用相同的方法为每个元素添加日期。
  • 抱歉,我没看到。忽略。
  • 添加一个有效的 sn-p 将帮助我们更轻松地解决您的问题。

标签: javascript jquery html date


【解决方案1】:

只需对现有函数稍作修改,您就可以像以前一样遍历唯一日期并添加它们。

  1. myFunction 中,我们现在将数据缩减为唯一的日期字符串,去掉时间。将reducer的逻辑提取到collectIfUniqueDateFromOrder函数中。

    function myFunction() {
      createList();
    
      $.getJSON('order-detail.json', function (data) {
        const uniqueDateStrings = data.reduce(collectIfUniqueDateFromOrder, []);
    
        uniqueDateStrings.forEach(addItemsInList);
      });
    }
    
    function collectIfUniqueDateFromOrder (uniqueDates, order) {
      var dateStringWithoutTime = order.date.split(" ")[0];
    
      if (!uniqueDates.includes(dateStringWithoutTime)) {
        uniqueDates.push(dateStringWithoutTime);
      }
    
      return uniqueDates;
    }
    
  2. addItemsInList 我们只处理日期字符串

    function addItemsInList(dateString) {
      var ul = document.getElementById('order-dates');
      var li = document.createElement('li');
      li.setAttribute('class', 'ord-date');
      ul.appendChild(li);
      var a = document.createElement('a');
      a.setAttribute('class', 'record-viewer');
      a.setAttribute('href', '#recordContent');
      a.innerHTML = dateString; // <--
      a.setAttribute('onclick', 'tableCreater()');
      li.appendChild(a);
    }
    

【讨论】:

    【解决方案2】:

    您可以使用moment js 来解析日期,以便您可以更改日期格式并使用date object 处理事物并通过Set 获得唯一列表

    或者您可以使用子字符串通过dateTimeString.substr(0,10)获取您的日期

    const datetime_dates = [
      "12-02-2019 15:37:30.201",
      "12-02-2019 15:37:30.201",
      "13-02-2019 15:37:30.201",
      "13-02-2019 15:37:30.201",
      "13-02-2019 15:37:30.201",
      "14-02-2019 15:37:30.201",
    ];
    
    const get_unique_dates = (dates) => {
      const dates_only = dates.map(date => moment(date, "DD-MM-YYY HH:mm:ss.SSS").format("DD-MM-YYYY"));
    
      const unique_dates = [...new Set(dates_only)];
      return unique_dates;
    }
    console.log(get_unique_dates(datetime_dates));
    
    // example with your data
    const orders = [
      {
        "storeName": "ireland",
        "langCode": "en_IE",
        "testCaseName": "Guest User Checkout - Credit Card",
        "orderID": "4001820209",
        "date": "12-02-2019 15:37:30.201",
        "cartTotal": "19.98"
      },
      {
        "storeName": "denmark",
        "langCode": "en_DK",
        "testCaseName": "Guest User Checkout - Credit Card",
        "orderID": "6001825084",
        "date": "12-02-2019 15:37:35.140",
        "cartTotal": "338 DKK"
      },
      {
        "storeName": "united_kingdom",
        "langCode": "en_GB",
        "testCaseName": "Guest User Checkout - Credit Card",
        "orderID": "7002541022",
        "date": "13-02-2019 15:45:08.038",
        "cartTotal": "13.04"
      }
    ]
    
    const order_dates = orders.map(order => order.date);
    const unique_order_dates = get_unique_dates(order_dates);
    console.log(unique_order_dates);
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"&gt;&lt;/script&gt;

    对于过滤,您最好在后端执行此操作,以提高性能,每次用户点击您的 date link 时都请求 ajax

    【讨论】:

    • TypeError: data.date.map is not a function 在我的情况下,即使我添加了 moment.min.js
    • 添加一个包含您的订单数据的示例。实际上,如果您不需要使用日期对象进行处理,您也可以通过对日期时间字符串进行切片来获取日期字符串。
    • 不需要日期库来执行此操作,日期将像字符串一样排序。与date.split(' ')[0]date.substr(0,10) 相比,转换为日期然后再转换回字符串只是为了修剪时间效率非常低。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多