【问题标题】:Get the minimum and maximum dates from JSON从 JSON 获取最小和最大日期
【发布时间】:2016-11-02 13:52:38
【问题描述】:

还有JSON:

[{"source":"2016-11-02","sourcecount":38},{"source":"2016-11-01","sourcecount":30},{"source":"2016-11-02","sourcecount":30},{"source":"2016-11-03","sourcecount":30}]

像在JavaScript中获取最大和最小日期一样吗?

【问题讨论】:

  • 所以你的 JSON 只有两个对象
  • 要么按日期对该数组进行排序并取第一个和最后一个值(如果数组大小很小),要么迭代并继续与最小值和最大值进行比较。试试看!
  • 迭代它们。考虑.forEach()
  • 遍历它们并提取日期然后对其进行排序...这可能对你有帮助 stackoverflow.com/questions/28013045/…
  • new Date(Math.max(...(arr.map(e => new Date(e.source))))).toISOString().split('T')[0]

标签: javascript


【解决方案1】:

var array = [{"source":"2016-11-02","sourcecount":38},{"source":"2016-11-01","sourcecount":30},{"source":"2016-11-02","sourcecount":30},{"source":"2016-11-03","sourcecount":30}];

var max = null;
var min = null;

for (var i = 0; i < array.length; i++) {
  var current = array[i];
  if (max === null || current.source > max.source) {
    max = current;
  }
  if (min === null || current.source < min.source) {
    min = current;
  }
}

document.getElementById('maxResult').innerHTML = max.source;
document.getElementById('minResult').innerHTML = min.source;
Max: <span id="maxResult"></span><br/ >
Min: <span id="minResult"></span>

【讨论】:

  • 如果我需要这个日期范围内的值怎么办?
  • 最大值和最小值。
  • 任何都可以,或者两者都可以。来源计数
【解决方案2】:

只要您的日期格式是“yyyy-MM-dd”,您就可以这样做。

将日期字符串转换为 dateKey。随着日期的进行,它始终遵循升序。 20160101(1 月 1 日)总是小于 20161231(12 月 31 日)。

记住这一点,只需将日期转换为 dateKey 并将 dateKeys 映射到对象,然后提取 dateKeys 的最大值和最小值并返回实际日期。

var datesArray = [{
  "source": "2016-11-02",
  "sourcecount": 38
}, {
  "source": "2016-11-10",
  "sourcecount": 30
}, {
  "source": "2016-11-31",
  "sourcecount": 38
}, {
  "source": "2016-01-01",
  "sourcecount": 30
}];

var newObject = {};
var dates = datesArray.map(function(obj) {
  var regEx = new RegExp(/-/g);
  //Convert date to dateKey
  var dateKey = parseInt(obj.source.replace(regEx, ""), 10)
  newObject[dateKey] = obj;
  return dateKey;
});

console.log("Max", newObject[Math.max(...dates)].source);
console.log("Min", newObject[Math.min(...dates)].source);

【讨论】:

  • 很好地使用了传播运算符。我也会为.map 使用箭头函数。
【解决方案3】:

好消息是,您的日期已经采用ISO 8601 格式。你可以简单地这样做,

var data = [{"source":"2016-11-02","sourcecount":38},{"source":"2016-11-01","sourcecount":30},{"source":"2016-11-02","sourcecount":30},{"source":"2016-11-03","sourcecount":30}];

var dateArr = data.map(function(v) {
  return new Date(v.source);
});

// Sort the date
dateArr.sort(function(a, b) {
  return a.getTime() - b.getTime();
  // OR `return a - b`
});

// The highest date is in the very last of array
var highestDate = dateArr[dateArr.length - 1];

// The lowest is in the very first..
var lowestDate = dateArr[0];

或者您更喜欢使用原始对象,那么您可以这样做,

var data = [{"source":"2016-11-02","sourcecount":38},{"source":"2016-11-01","sourcecount":30},{"source":"2016-11-02","sourcecount":30},{"source":"2016-11-03","sourcecount":30}];

data.sort(function(a,b) {
  var date1 = (new Date(a.source));
  var date2 = (new Date(b.source));
  return date1 - date2;
});

// highest date is '2016-11-03'
var highestDate = data[data.length - 1].source

// lowest date is '2016-11-01'
var lowestDate = data[0].source

【讨论】:

  • 我更喜欢第一个。谢谢 TIL。
【解决方案4】:

试试这个

var data = [{"source":"2016-11-02","sourcecount":38},{"source":"2016-11-01","sourcecount":30},{"source":"2016-11-02","sourcecount":30},{"source":"2016-11-03","sourcecount":30}]
function compare(a,b) {
   if (new Date(a.source) < new Date(b.source))
     return -1;
   if (new Date(a.source) > new Date(b.source))
     return 1;
   return 0;
}
data = data.sort(compare);
var minDate = data[0].source;
var maxDate = data[data.length - 1].source;

【讨论】:

  • 性能方面,效率不高。 sorto(nlogn),但是您可以通过遍历 o(n) 中的数组来找到最小值和最大值。
猜你喜欢
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多