【问题标题】:array of objects return the highest overall value from the latest date对象数组返回最近日期的最高总价值
【发布时间】:2016-05-13 15:42:56
【问题描述】:

我有类似的结构:

var array = [
  {
    "overall": 8,
    "date": "2016-03-15",
    "review": "bla bla",
  },
  {
    "overall": 6,
    "date": "2016-01-19",
    "review": "asfasfsadfsd",
  },
  {
    "overall": 7,
    "date": "2016-01-23",
    "review": "adfsasfdasfas",
  }];

返回最大值:

var highestScore = Math.max.apply(Math,array.map(function(o){return o.overall;}));

如何过滤此数组以获取与最近日期的最高总价值相关的评论?在这种情况下“bla bla”

【问题讨论】:

  • 假设同一日期可以有多个值是否正确?
  • 示例应该显示问题,换句话说,它应该有 2 个最新日期。

标签: javascript arrays filter


【解决方案1】:

不需要对数组进行排序,因为您只想获得最高值。所以使用 reduce() 并使用 Date.parse() 比较日期字符串。

var array = [{
  "overall": 5,
  "date": "2016-03-15",
  "review": "sadas sasdadasdas",
}, {
  "overall": 6,
  "date": "2016-01-19",
  "review": "asfasfsadfsd",
}, {
  "overall": 9,
  "date": "2016-03-15",
  "review": "sadas sasdadasdas",
}, {
  "overall": 7,
  "date": "2016-01-23",
  "review": "adfsasfdasfas",
}];

var res = array.reduce(function(a, b) {
  // parse the date
  var d1 = Date.parse(a.date),
    d2 = Date.parse(b.date);
  // if dates are equal compare value of overall and return value , else return based on date
  return d1 == d2 ? (a.overall > b.overall ? a : b) : (d1 > d2 ? a : b);
}).overall; // get overall value from final object

document.write(res);

【讨论】:

  • 最新日期的最高总价值,您返回的只是最高总价值。在这种情况下,它将是五个
  • 是否应该在日期相同时比较.overall,以便在有绑定日期时给出最高的.overall 值?
  • 我正要评论同样的事情^
  • 这是迄今为止最好的答案
【解决方案2】:

你可以使用.sort()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

var array = [{
  "overall": 5,
  "date": "2016-03-15",
  "review": "sadas sasdadasdas",
}, {
  "overall": 6,
  "date": "2016-01-19",
  "review": "asfasfsadfsd",
}, {
  "overall": 7,
  "date": "2016-01-23",
  "review": "adfsasfdasfas",
}];
var sortedArray = array.sort(function(a, b) {
  var aDate = Date.parse(a.date);
  var bDate = Date.parse(b.date);
  if (aDate > bDate) {
    return true;
  } else if(aDate == bDate) {
    return a.overall > b.overall;
  } else {
    return false;
  }
});
//hello
var isItMeYoureLookingFor = sortedArray[0];

基本上,按条件排序,取第一个:)。

【讨论】:

  • 我不会使用排序,因为我们不需要排序数组,只需要一个值。我个人更喜欢使用 .reduce 的其他答案(如果它已更新为在技术上对问题正确)。
  • 为什么要如此强烈地避免排序?我喜欢这两种方法,如果这种方法对您来说更具可读性,或者如果您认为排序后的数组稍后会有用,那么在大多数情况下排序不会有性能问题。
  • 只是.sort是不必要的。同样的原因,我会尽可能使用.call 而不是.apply。为工作使用正确的工具,你知道吗?
  • 我想指出的另一件事是您正在对原始数组进行排序(使新的变量声明变得多余且具有误导性)。一个可能的警告是,如果原始数组索引存储在其他地方,它们现在很可能指向错误的索引。
  • 我认为根据问题的上下文,排序可能是个好主意。从外观上看,数组中没有太多要排序的项目,因此计算成本并不高,它也是域逻辑的声明性。我认为排序是合适的。
【解决方案3】:

使用普通数组迭代:

function newestHighestOverall(arr){
  if(arr.length == 0) return 0;

  var latestDate = new Date(arr[0].date);
  var highestOverall = arr[0].overall;

  for(var i=0;i<arr.length;i++){
    if(latestDate < new Date(arr[i].date)){
        highestOverall = arr[i].overall;
        latestDate = new Date(arr[i].date);
    }else if(latestDate == new Date(arr[i].date)){
        highestOverall = Math.max(highestOverall, arr[i].overall);
    }
  }
  return highestOverall
}

console.log(newestHighestOverall(array))

【讨论】:

    【解决方案4】:

    您可以使用sort 并首先通过date 进行比较,然后通过overall 进行比较,并返回review

    var array = [{
      "overall": 8,
      "date": "2016-03-15",
      "review": "bla bla",
    },{
      "overall": 20,
      "date": "2016-03-15",
      "review": "Random bla bla",
    }, {
      "overall": 6,
      "date": "2016-01-19",
      "review": "asfasfsadfsd",
    }, {
      "overall": 7,
      "date": "2016-01-23",
      "review": "adfsasfdasfas",
    }];
    
    result = array.sort((a, b) => {
      return Date.parse(b.date) - Date.parse(a.date) || b.overall - a.overall;
    })[0].review;
    console.log(result)

    【讨论】:

    • 我真的很喜欢这个答案的逻辑,但我仍然认为.reduce 会更好用。如果您想用它更新您的答案,我已经为您制作了一个示例小提琴jsfiddle.net/bhn14gb8/1
    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2013-09-28
    • 2017-08-14
    • 2015-02-04
    • 1970-01-01
    相关资源
    最近更新 更多