Así que aquí tengo un sistema que identifica el objeto con el count más alto, sin embargo, como podemos ver, hay dos objetos que tienen el count más alto. Lo que quiero poder hacer es tomar los mejores recuentos, por muchos que sean, y generar uno al azar. ¿Cómo puedo hacer esto?

 var objects = [
    {username: 'mark', count: 3},
    {username: 'dave', count: 5},
    {username: 'john', count: 5},
    {username: 'lucy', count: 2},
];

var res = objects.reduce(function(resObj, obj) {
  return resObj.count > obj.count ? resObj : obj
})

console.log(res);

¡Gracias!

1
mellows 9 may. 2016 a las 02:43

3 respuestas

La mejor respuesta

Buena pregunta aquí es cómo puedes hacerlo

Nota : agregué algunos más de los mismos recuentos para mostrarle cómo funciona esto, independientemente de cuántas coincidencias tenga:

Ejemplo de trabajo

 var objects = [
    {username: 'mark', count: 3},
    {username: 'dave', count: 5},
    {username: 'john', count: 5},
    {username: 'amy', count: 5},
    {username: 'adam', count: 5},
    {username: 'fenty', count: 5},
    {username: 'lucy', count: 2},
];
// make an array to push same counts
var arr = [];

var res = objects.reduce(function(resObj, obj) {
  // keep track of (and set) max count
  var max = Math.max(resObj.count, obj.count);
  // if count is equal push to our array
  if (max === obj.count) {
    arr.push(obj);
  }
  // same code as before
  return resObj.count >= obj.count ? resObj : obj;
});

// get random index from our array
var randIndex = Math.floor(Math.random() * arr.length);

// get random result from our objects that have the same count:
console.log(arr[randIndex]);
3
omarjmh 8 may. 2016 a las 23:58

Aquí está la respuesta usando simples para bucles. Devuelve el objeto más alto al azar

function getHighest(objects) {
    var highest = 0;
    var heighestArr = [];
    // first get highest index
    for(var i=1; i<objects .length;i++){
         if(objects[i].count > objects[highest].count){
              highest= i;
         }
    }
    // then add all the highest ones in an array  
    for(var i=0; i<objects .length;i++){
         if(objects[i].count === objects[highest].count){
              heighestArr.push(objects[i])
         }
    }
    // return random from that array
    return heighestArr[Math.floor(Math.random()*heighestArr.length)];
}
1
Sumama Waheed 9 may. 2016 a las 00:02
 var objects = [
    {username: 'mark', count: 3},
    {username: 'dave', count: 5},
    {username: 'john', count: 5},
    {username: 'lucy', count: 2},
];

var res = objects.slice(1).reduce(function(resObj, obj) {
  if (resObj[0].count > obj.count) {
    return resObj;
  } else if (resObj[0].count === obj.count) {
    return [...resObj, obj];
  } else {
    return [obj]
  }
}, [objects[0]])

var randomElement = function(arr) {
  return arr[Math.floor(Math.random() * arr.length)];
}

console.log(randomElement(res));

No probado pero esta es la idea básica.

0
telaviv 9 may. 2016 a las 00:10