【问题标题】:Getting key with the highest value from object从对象中获取具有最高值的键
【发布时间】:2014-12-09 10:09:14
【问题描述】:

我有一个类似的对象:

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

如何快速从中提取最大值标识符(此处为:b)?我尝试将其转换为数组,然后进行排序,但没有成功,因为它是按字母顺序排序的(为了从三个值中取一个值来回处理数据似乎有点过头了)。

【问题讨论】:

标签: javascript


【解决方案1】:

例如:

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

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

ES6 中:

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

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

【讨论】:

  • 谢谢,但请注意可以有更多项目,例如c, d, e... x
  • 这适用于更多项目。reduce 函数是对整个数组的迭代;)
  • 很抱歉打扰了,但是除了b,我还怎么获得2
  • @CD.. 如果我在这种情况下使用它“var obj = {a: 1, b: 2, c: 2};”它只返回 c 但我需要 b & c,表示所有具有最高值的键
  • @Dinesh,试试: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; }, []);
【解决方案2】:

使用下划线或 Lo-Dash:

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

使用 ES6 箭头函数:

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

jsFiddle demo

【讨论】:

  • 从 Lo-Dash 4.0.0 开始,现在应该是 var maxKey = _.maxBy(_.keys(obj), function (o) { return obj[o]; });
【解决方案3】:

如果您有许多相等的值,而不仅仅是一个最大值,这里有一个建议:

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

这将返回一个数组,其中所有的键都具有最大值,以防有一些具有相等的值。 例如:如果

const obj = {苹果:1,香蕉:1,梨:1}
//这将返回 ['apples', 'bananas', 'pears']

另一方面,如果有最大值:

const obj = {苹果:1,香蕉:2,梨:1}; //这将返回 ['bananas']
---> 从数组中取出字符串: ['bananas'][0] //returns 'bananas'`

【讨论】:

  • 嗨,我应该把对象变量准确地放在哪里?当我 console.log 我得到一个“函数 getMax()”
  • object 是上面函数的参数,上面是定义函数的 ES6 语法,相当于:function getMax(object),这能回答你的问题吗?
【解决方案4】:

假设你有一个这样的Object

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

你可以这样做

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

【讨论】:

    【解决方案5】:

    非常基本的方法。处理速度可能很慢

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

    【讨论】:

      【解决方案6】:
      {a: 1, b: 2, undefined: 1}
      

      我见过的最好的解决方法是这个

      const chars = {a: 1, b: 2, undefined: 1}
      
      //set maximum value to 0 and maxKey to an empty string
      let max = 0;
      let maxKey = "";
      
      for(let char in chars){
        if(chars[char]> max){
          max = chars[char];
          maxKey= char
        }
      }
      
      console.log(maxKey)

      【讨论】:

        【解决方案7】:

        结合其他答案的一些想法。这将获取所有具有最高值的键,但使用扩展运算符获取最大值然后过滤数组方法:

        const getMax = object => {
          let max = Math.max(...Object.values(object))
          return Object.keys(object).filter(key => object[key]==max)
        }
        
        let obj = {a: 12, b: 11, c: 12};
        getMax(obj)
        

        【讨论】:

          【解决方案8】:
          let data = {a:1,b:2,undefined:3}
          let maxValue = Object.entries(data).sort((x,y)=>y[1]-x[1])[0]
          

          注意:这是一个非常昂贵的过程,如果用于大尺寸的对象(> = 1000000)会阻塞事件循环。使用大数组切片条目并使用 setTimeout 反复调用上述方法。

          【讨论】:

            猜你喜欢
            • 2016-06-28
            • 1970-01-01
            • 2022-01-07
            • 2016-10-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-12
            • 1970-01-01
            相关资源
            最近更新 更多