2014-12-09 15 views
22

Ho un oggetto come quello:Ottenere chiave con il valore più alto da oggetto

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

Come posso tirare rapidamente la più grande identificatore valore (qui: b) da esso? Ho provato a convertirlo in array e poi a fare l'ordinamento, ma non ha funzionato, dato che è stato ordinato alfabeticamente (e sembra un overkill per manipolare i dati avanti e indietro solo per ottenere un valore su tre).

+0

cosa desiderate ottenere '2' o' b' come risultato –

+0

Voglio ottenere 'b' ;-) –

+0

vedere :: http://stackoverflow.com/questions/11142884/fast-way-to-get-the-min-max -valori-tra-proprietà-di-oggetto .. risposta bonus :: ottieni anche il valore minimo insieme a max in questa risposta .. :) –

risposta

43

Ad esempio:

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

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

In ES6:

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

Object.keys(obj).reduce((a, b) => obj[a] > obj[b] ? a : b); 
+2

http://jsfiddle.net/7GCu7/149/ ecco la dimostrazione +1 –

+0

Grazie, ma tieni presente che possono esserci più elementi, come 'c, d, e ... x'. –

+1

questo funziona per più elementi .. la funzione di riduzione è un'iterazione attraverso l'intera matrice;) –

4

si Supponendo hai un Object come questo:

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

Si può fare questo

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]); 
0

Metodo molto di base. potrebbe essere lento per elaborare

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)); 
10

Utilizzando sottolineatura o Lo-Dash:

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

jsFiddle demo:

http://jsfiddle.net/jt631Lcc/

+3

A partire da Lo-Dash 4.0.0 questo dovrebbe ora essere 'var maxKey = _.maxBy (_. Keys (obj), function (o) {return obj [o];});'. – thodic

0

Ecco un suggerimento nel caso in cui si dispone di molti valori uguali e non solo un massimo:

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

Questo restituisce un array, con le chiavi per tutti loro con il valore massimo, nel caso in cui ci siano alcuni che hanno valori uguali. Per esempio: se

const obj = {mele: 1, banane, pere: 1: 1}
// Ciò restituirà [ 'mele', 'banane', 'pere']

Se invece c'è un massimo:

const obj = {mele: 1, banane: 2, pere: 1}; // Questo restituirà [ 'banane']
---> Per ottenere la stringa di fuori della matrice: [ 'banane'] [0] // bananas'` restituisce'

Problemi correlati