Obteniendo la clave con el valor más alto del objeto

82

Tengo un objeto como ese:

Object {a: 1, b: 2, undefined: 1} 

¿Cómo puedo extraer rápidamente el identificador de valor más grande (aquí b:)? Intenté convertirlo en una matriz y luego ordenar, pero no funcionó, ya que se ordenó alfabéticamente (y parece una exageración hacer malabares con los datos de un lado a otro solo para obtener un valor de tres).

Tomek Buszewski
fuente
¿quieres obtener 2o bcomo resultado?
Naeem Shaikh
2
Quiero conseguir b;-)
Tomek Buszewski
ver :: stackoverflow.com/questions/11142884/… .. respuesta de bonificación :: también obtiene el valor mínimo junto con el máximo en esta respuesta .. :)
Sudhir Bastakoti

Respuestas:

132

Por ejemplo:

var obj = {a: 1, b: 2, undefined: 1};

Object.keys(obj).reduce(function(a, b){ return obj[a] > obj[b] ? a : b });

En ES6 :

var obj = {a: 1, b: 2, undefined: 1};

Object.keys(obj).reduce((a, b) => obj[a] > obj[b] ? a : b);
DISCOS COMPACTOS..
fuente
1
Gracias, pero tenga en cuenta que puede haber más elementos, como c, d, e... x.
Tomek Buszewski
7
esto funciona para más elementos ... la función de reducción es una iteración a través de toda la matriz;)
Faris Zacina
Perdón por ser una molestia, pero ¿cómo puedo obtener un 2además b?
Tomek Buszewski
@CD .. si utilizo esto en este caso "var obj = {a: 1, b: 2, c: 2};" devuelve solo c pero necesito b & c, significa todas las claves con los valores más altos
Dinesh
3
@Dinesh, prueba:var obj = {a: 1, b: 2, c: 2}, keys = Object.keys(obj), largest = Math.max.apply(null, keys.map(x => obj[x])) result = keys.reduce((result, key) => { if (obj[key] === largest){ result.push(key); } return result; }, []);
CD ..
34

Usando subrayado o Lo-Dash:

var maxKey = _.max(Object.keys(obj), function (o) { return obj[o]; });

Con funciones de flecha ES6:

var maxKey = _.max(Object.keys(obj), o => obj[o]);

jsFiddle demo

Faris Zacina
fuente
14
A partir de Lo-Dash 4.0.0 esto debería ser ahora var maxKey = _.maxBy(_.keys(obj), function (o) { return obj[o]; });.
thodic
9

Aquí hay una sugerencia en caso de que tenga muchos valores iguales y no solo un máximo:

    const getMax = object => {
        return Object.keys(object).filter(x => {
             return object[x] == Math.max.apply(null, 
             Object.values(object));
       });
    };

Esto devuelve una matriz, con las claves para todas ellas con el valor máximo, en caso de que haya algunas que tengan valores iguales. Por ejemplo: si

const obj = {manzanas: 1, plátanos: 1, peras: 1}
// Esto devolverá ['manzanas', 'plátanos', 'peras']

Si por el contrario hay un máximo:

const obj = {manzanas: 1, plátanos: 2, peras: 1}; // Esto devolverá ['bananas']
---> Para sacar la cadena de la matriz: ['bananas'] [0] // devuelve 'bananas'`

policon
fuente
Hola, ¿dónde debería poner el objeto var exactamente? Cuando consuelo.log obtengo una "función getMax ()"
Jeff
1
objectes el argumento que toma la función anterior, lo anterior es la sintaxis ES6 para definir funciones, equivalente a:, function getMax(object)¿responde eso a su pregunta?
polyccon
6

Suponiendo que tengas una Objectcomo esta:

var obj = {a: 1, b: 2, undefined: 1}

Puedes hacerlo

var max = Math.max.apply(null,Object.keys(obj).map(function(x){ return obj[x] }));
console.log(Object.keys(obj).filter(function(x){ return obj[x] == max; })[0]);
Amit Joki
fuente
4

Método muy básico. puede ser lento de procesar

var v = {a: 1, b: 2, undefined: 1};

function geth(o){
    var vals = [];    
    for(var i in o){
       vals.push(o[i]);
    }

    var max = Math.max.apply(null, vals);

     for(var i in o){
        if(o[i] == max){
            return i;
        }
    }
}

console.log(geth(v));
astroanu
fuente
0

const data = {
  abc: '',
  myShortKey: '',
  myVeryLongKey: ''
}


const longestKeyLength = Math.max(...Object.keys(data).map((d) => d.length));

console.log(longestKeyLength);

console.log(Object.entries(data).map(([key, val]) => `${key}: ${key.length}`));

Charley Bodkin
fuente