Tengo una estructura similar:

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",
  }];

Esto devuelve el valor más alto:

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

¿Cómo puedo filtrar esta matriz para obtener la revisión que se relaciona con el valor general más alto desde la última fecha? En este caso "bla bla"

3
Alessandro 13 may. 2016 a las 18:42

4 respuestas

La mejor respuesta

No es necesario ordenar la matriz, ya que solo desea obtener el valor más alto. Entonces use reduce() y para comparar la cadena de fecha, analícela usando 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);
3
Pranav C Balan 13 may. 2016 a las 16:12

Podrías usar .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];

Básicamente, ordene con criterios, tome el primero :).

2
Rhys Bradbury 14 may. 2016 a las 02:15

Puede usar sort y primero comparar por date y luego por overall y también devolver revisión .

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)
0
Nenad Vracar 13 may. 2016 a las 16:09

Usando iteración de matriz simple:

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))
1
juvian 13 may. 2016 a las 16:04