【问题标题】:Finding minimum and maximum date in an complex json array在复杂的 json 数组中查找最小和最大日期
【发布时间】:2016-06-21 07:34:45
【问题描述】:

我有一个这样的 json 数组。

var data=[
{
    Title:"Dummy1",
    Events:[{
    eventName:"StartDate"
    Date:"Jan-2014"
    },
    {
    eventName:"EndDate"
    Date:"Feb-2015"
    }]
},
{
    Title:"Dummy2",
    Events:[{
    eventName:"StartDate"
    Date:"Jan-2013"
    },
    {
    eventName:"EndDate"
    Date:"Feb-2015"
    }]
},
{
    Title:"Dummy3",
    Events:[{
    eventName:"StartDate"
    Date:"Feb-2014"
    },
    {
    eventName:"EndDate"
    Date:"Mar-2015"
    }]
}];

请注意,日期本身并不是日期对象。它们是字符串。

我需要找到 StartDate 的最小值和 EndDate 的最大值 所以结果应该是

MinStartDate:Jan-2013
MaxEndDate:Mar-2015

如果不是 javascript 或 jquery 也可以,我更喜欢使用 angular。

提前致谢。

【问题讨论】:

  • SO 不是为我编写代码服务。请发布您至少尝试过的内容。
  • angular,javascript,jQuery -----你做过什么吗?
  • 我可以通过查找数组中每个对象的最小和最大日期来实现相同的目的。就像 Dummy1、Dummy2 和 Dummy3 一样,我找到了最小和最大日期,然后我找到了其中的最大值和最小值。我无法直接查询数据对象。
  • 好的,让我告诉你一些事情。 1) Angular js 不是一种神奇的新编程语言。它仍然是 javascript(对于 jQuery 也是如此)。 2)在询问堆栈溢出问题之前先尝试一下。
  • @user1494162:我已经在上面的评论中发布了我尝试过的内容。关于 angular 和 javascript 函数,我的意思是,在 angular 中还有其他内置函数。如果我们可以使用更少的代码而不是我所做的那样来实现结果会更好。

标签: javascript jquery angularjs json


【解决方案1】:

有我的解决方案,这有点长,但很容易理解和编辑任何更新。 我确信我们可以用 4-5 行来解决它,但无论如何,它都有效。

首先,定义一个月份数组:

var month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

就像每次你需要在数组中搜索 min/max 一样,你需要用第一个值初始化 min 和 max:

var max_end_date = data[0].Events[1].Date;
var min_start_date = data[0].Events[0].Date;

然后,将每个日期拆分为开始和结束的比较年/月,您会得到这样的结果:

$.each(data, function(k, v) {
    var month_min_start_date = min_start_date.split("-")[0];
    var year_min_start_date = min_start_date.split("-")[1];

    var current_start_date = v.Events[0].Date;
    var month_current_start_date = current_start_date.split("-")[0];
    var year_current_start_date = current_start_date.split("-")[1];

    if (year_current_start_date < year_min_start_date 
        || year_current_start_date == year_min_start_date && month.indexOf(month_current_start_date) < month.indexOf(month_min_start_date)) {
            min_start_date = current_start_date;
        }

    var month_max_end_date = max_end_date.split("-")[0];
    var year_max_end_date = max_end_date.split("-")[1];

    var current_end_date = v.Events[1].Date;
    var month_current_end_date = current_end_date.split("-")[0];
    var year_current_end_date = current_end_date.split("-")[1];

    if (year_current_end_date > year_max_end_date 
        || year_current_end_date == year_max_end_date && month.indexOf(month_current_end_date) > month.indexOf(month_max_end_date)) {
            max_end_date = current_end_date;
        }

})

你可以在JSFiddle上试试

【讨论】:

    【解决方案2】:

    这是使用Math的另一种方法

    var data=[
    {
        Title:"Dummy1",
        Events:[{
        eventName:"StartDate",
        Date:"Jan-2014"
        },
        {
        eventName:"EndDate",
        Date:"Feb-2015"
        }]
    },
    {
        Title:"Dummy2",
        Events:[{
        eventName:"StartDate",
        Date:"Jan-2013"
        },
        {
        eventName:"EndDate",
        Date:"Feb-2015"
        }]
    },
    {
        Title:"Dummy3",
        Events:[{
        eventName:"StartDate",
        Date:"Feb-2014"
        },
        {
        eventName:"EndDate",
        Date:"Mar-2015"
        }]
    }];
    
    var startDates = [],
        endDates = [];
    
    for (i = 0; i < data.length; i++) {
      startDates.push(Date.parse(data[i].Events[0].Date));
      endDates.push(Date.parse(data[i].Events[1].Date));
      
    }
    
    Array.min = function( array ){
    return Math.min.apply( Math, array );
    };
    
    Array.max = function( array ){
    return Math.max.apply( Math, array );
    };
    
    // or use a library like Moment.js to format dates
    var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    
    
    var minDate = new Date(Array.min(startDates)),
        minDateFormat = months[minDate.getMonth()]+'-'+minDate.getFullYear();
    
    var maxDate = new Date(Array.max(endDates)),
        maxDateFormat = months[maxDate.getMonth()]+'-'+maxDate.getFullYear();
    
    
    
    console.log(minDateFormat );
    console.log(maxDateFormat);

    【讨论】:

      【解决方案3】:

      我创建了一个名为 dataSort() 的函数,并对数据数组 ASC 或 DESC 顺序进行了排序。由于我按字段对数组进行了排序,因此很容易选择最小值或最大值。

      <script>
      var data = [
          {
              Title: "Dummy1",
              Events: [{
                  eventName: "StartDate",
                  Date: "Jan-2014"
              },
                  {
                      eventName: "EndDate",
                      Date: "Feb-2015"
                  }]
          },
          {
              Title: "Dummy2",
              Events: [{
                  eventName: "StartDate",
                  Date: "Jan-2013"
              },
                  {
                      eventName: "EndDate",
                      Date: "Feb-2015"
                  }]
          },
          {
              Title: "Dummy3",
              Events: [{
                  eventName: "StartDate",
                  Date: "Feb-2014"
              },
                  {
                      eventName: "EndDate",
                      Date: "Mar-2015"
                  }]
          }];
      
      
      function dataSort(jsonData, orderBy, order) {
          var index = 0; // 0 StartDate
          if (orderBy == 'EndDate') {
              index = 1; // 1  EndDate
          }
      
          jsonData.sort(function (a, b) {
      
              var ad = a.Events[index].Date;
              ad = ad.replace(new RegExp('-'), '1, ')
              aStartdate = new Date(Date.parse(ad));
      
      
              var bd = b.Events[index].Date;
              bd = bd.replace(new RegExp('-'), '1, ')
              bStartdate = new Date(Date.parse(bd));
              if (order == 'ASC') {
                  return aStartdate - bStartdate; // asc
              } else {
                  return bStartdate - aStartdate; // desc
              }
      
      
          });
      
          return jsonData;
      }
      
      
      var dataSortByStartDate = dataSort(data, 'StartDate', 'ASC');
      var MinStartDate = dataSortByStartDate[0].Events[0].Date;
      console.log('MinStartDate: ' + MinStartDate);
      
      var dataSortByEndDate = dataSort(data, 'EndDate', 'DESC');
      var MaxEndDate = dataSortByEndDate[0].Events[1].Date;
      console.log('MaxEndDate: ' + MaxEndDate);
      

      【讨论】:

        猜你喜欢
        • 2012-09-05
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多