Nesneden en yüksek değere sahip anahtarı elde etme


88

Bunun gibi bir nesnem var:

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

En büyük değer tanımlayıcısını (burada b:) ondan hızlı bir şekilde nasıl çekebilirim ? Onu diziye dönüştürmeyi ve sonra sıralamayı denedim, ancak işe yaramadı, çünkü alfabetik olarak sıralandı (ve üçte bir değer elde etmek için verileri ileri geri hareket ettirmek aşırı bir şey gibi görünüyor).


almak mı istiyorsun 2yoksa bsonuç mu
Naeem Shaikh

2
b;-) almak istiyorum
Tomek Buszewski

bkz :: stackoverflow.com/questions/11142884/… .. bonus cevap :: bu cevapta max ile birlikte minimum değer de elde edersiniz .. :)
Sudhir Bastakoti

Yanıtlar:


143

Örneğin:

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
Teşekkürler, ama lütfen daha fazla öğe olabileceğini unutmayın c, d, e... x.
Tomek Buszewski

9
Daha fazla öğe için bu eserler .. işlev tüm dizi boyunca bir yineleme azaltmak;)
Faris Zacina

Maalesef olduğu için rahatsız, ama nasıl ben de alabilirim 2yanında b?
Tomek Buszewski

@CD .. bunu bu durumda kullanırsam "var obj = {a: 1, b: 2, c: 2};" yalnızca c döndürür, ancak b & c'ye ihtiyacım var, en yüksek değerlere sahip tüm anahtarlar anlamına gelir
Dinesh

3
@Dinesh, deneyin: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 ..

35

Alt Çizgi veya Lo-Dash Kullanma:

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

ES6 Ok Fonksiyonları ile:

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

jsFiddle demosu


15
Lo-Dash 4.0.0'dan itibaren bu artık olmalıdır var maxKey = _.maxBy(_.keys(obj), function (o) { return obj[o]; });.
thodic

9

Burada, yalnızca bir maksimum değere değil, çok sayıda eşit değere sahip olmanız durumunda bir öneri var:

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

Bu, eşit değerlere sahip bazılarının olması durumunda, tümü için maksimum değere sahip anahtarların bulunduğu bir dizi döndürür. Örneğin: if

const obj = {elma: 1, muz: 1, armut: 1}
// Bu ['elmalar', 'muzlar', 'armutlar'] döndürür

Öte yandan bir maksimum varsa:

const obj = {elma: 1, muz: 2, armut: 1}; // Bu, ['muzlar']
---> Diziyi diziden çıkarmak için: ['muzlar'] [0] // 'muzlar''ı döndürür


Merhaba, var nesnesini tam olarak nereye koymalıyım? Console.log'u kullandığımda bir "function getMax ()" alıyorum
Jeff

1
objectYukarıdaki işlevin aldığı argümandır, yukarıdakiler işlevleri tanımlamak için ES6 sözdizimidir, şuna eşdeğerdir:, function getMax(object)bu sorunuza cevap veriyor mu?
polikon

6

Şöyle olduğunu varsayarsak Object:

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

Bunu yapabilirsiniz

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

4

Çok basit bir yöntem. işlemek yavaş olabilir

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

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}`));

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.