Nhận khóa có giá trị cao nhất từ ​​đối tượng


82

Tôi có một đối tượng như thế:

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

Làm cách nào để tôi có thể nhanh chóng lấy giá trị nhận dạng lớn nhất (tại đây b:) từ nó? Tôi đã thử chuyển đổi nó thành mảng và sau đó sắp xếp, nhưng nó không thành công, vì nó được sắp xếp theo thứ tự bảng chữ cái (và có vẻ như là quá mức cần thiết để tung dữ liệu qua lại chỉ để nhận được một trong ba giá trị).


Bạn có muốn nhận được 2hoặc bkết quả là
Naeem Shaikh

2
Tôi muốn lấy b;-)
Tomek Buszewski

xem :: stackoverflow.com/questions/11142884/… .. câu trả lời bổ sung :: bạn nhận được giá trị tối thiểu cũng như giá trị tối đa trong câu trả lời này .. :)
Sudhir Bastakoti

Câu trả lời:


132

Ví dụ:

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

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

Trong ES6 :

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

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

1
Cảm ơn, nhưng xin lưu ý rằng có thể có nhiều mặt hàng hơn, như c, d, e... x.
Tomek Buszewski

7
công trình này cho các hạng mục hơn .. các giảm chức năng là một lặp thông qua toàn bộ mảng;)
Faris Zacina

Xin lỗi vì đã làm phiền một, nhưng làm thế nào tôi có thể cũng nhận được một 2bên cạnh b?
Tomek Buszewski

@CD .. nếu tôi sử dụng điều này trong trường hợp này "var obj = {a: 1, b: 2, c: 2};" nó chỉ trả về c nhưng tôi cần b & c, có nghĩa là tất cả các khóa có giá trị cao nhất
Dinesh

3
@Dinesh, hãy thử: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

Sử dụng Dấu gạch dưới hoặc Dấu gạch ngang:

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

Với các chức năng mũi tên ES6:

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

jsFiddle demo


14
Kể từ Lo-Dash 4.0.0, điều này sẽ xảy ra var maxKey = _.maxBy(_.keys(obj), function (o) { return obj[o]; });.
thodic

9

Dưới đây là một gợi ý trong trường hợp bạn có nhiều giá trị bằng nhau và không chỉ có một giá trị tối đa:

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

Điều này trả về một mảng, với các khóa của tất cả chúng đều có giá trị lớn nhất, trong trường hợp có một số có giá trị bằng nhau. Ví dụ: nếu

const obj = {táo: 1, chuối: 1, lê: 1}
// Điều này sẽ trả về ['táo', 'chuối', 'lê']

Mặt khác, nếu có tối đa:

const obj = {táo: 1, chuối: 2, lê: 1}; // Điều này sẽ trả về ['banana']
---> Để lấy chuỗi ra khỏi mảng: ['banana'] [0] // trả về 'banana' '


Xin chào, chính xác thì tôi nên đặt đối tượng var ở đâu? Khi tôi console.log tôi nhận được một "chức năng GetMax ()"
Jeff

1
objectlà đối số mà hàm trên nhận, ở trên là cú pháp ES6 để xác định các hàm, tương đương với : function getMax(object), điều đó có trả lời câu hỏi của bạn không?
polyccon

6

Giả sử bạn Objectnhư thế này:

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

Bạn có thể làm được việc này

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

Phương pháp rất cơ bản. có thể chậm xử lý

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.