快速查看最大变量的方法?

时间:2016-01-09 09:33:23

标签: javascript

我需要一种方法来获取具有最大值的变量的名称。

a = 55;
b = 13;
c = 45;
d = 5;

var top = '';
if((a>b)&&(a>c)&&(a>d)){ top = 'a'; }
if((b>a)&&(b>c)&&(b>d)){ top = 'b'; }
if((c>a)&&(c>b)&&(c>d)){ top = 'c'; }
if((d>a)&&(d>b)&&(d>c)){ top = 'd'; }

有更好或更快的方法吗?

5 个答案:

答案 0 :(得分:3)

您无法直接获取变量名称:

  

很少有语言支持您想要做的事情,因为变量   名称仅在源代码中为您的利益而存在。他们不   以该形式存在于已编译的可执行代码中   跟踪它们将非常昂贵。

     

如果你想这样做,你的设计存在根本性的错误,因为没有理由阻止以最常用的方式使用associative array ,在JavaScript中表示在适用时使用Object或实际Map

基于对象的方法:

如果您无法访问Map,则最兼容的方式:

您可以使用对象并查找属性名称。最简洁的方法是使用Array.reduce()函数。

var obj = {a:55,b:13,c:45,d:5};

var maxPropertyName = Object.keys(obj).reduce(function(previous,key){
    return obj[previous] > obj[key] ? previous : key;
})

console.log(maxPropertyName);

输出:

a

基于地图的方法:

对于这种情况,Map似乎更合适,因为这看起来像是同质Collection而不是Type

  

地图实例仅对集合有用,并且   您应该考虑在以前使用过的地方调整代码   这样的对象。对象应用作记录,包含字段和   方法。如果您仍然不确定使用哪一个,请问问自己   以下问题:

     
      
  • 在运行时,键通常是未知的,你需要查看它们吗?   动态

  •   
  • 所有值都具有相同的类型,可以互换使用吗?   你需要不是字符串的键吗?

  •   
  • 是否经常添加或删除键值对?你有吗?   任意(容易改变)键值对的数量?

  •   
  • 集合是否已迭代?这些都是您想要Map的标志   收集。

  •   
     

如果相反,您有固定数量的键,请对它们进行操作   单独地,并区分他们的用法,然后你想要一个   对象

以下是向Map添加.reduce()方法的方法:

Map.prototype.reduce = function(callback){
    'use strict';
    if (this == null) {
      throw new TypeError('Array.prototype.reduce called on null or undefined');
    }
    if (typeof callback !== 'function') {
      throw new TypeError(callback + ' is not a function');
    }
    var t = Object(this), value;
    if (t.size === 0) { value = undefined; }
    else if (t.size === 1) { value = t.keys().next().value; }
    else {
      value = t.keys().next().value;
      for (var kv of t) {
          value = callback(value, kv[0]);
      }
    }
    return value;
};

相同的.reduce()代码现在有效:

var m = new Map([["a",55],["b",13], ["c",45],["d",5]]);

var maxPropertyName = m.reduce(function(previous,key){
    return m.get(previous) > m.get(key) ? previous : key;
})
console.log(maxPropertyName);

输出:

a

答案 1 :(得分:1)

一种简单的方法,将所有内容存储在一个对象中并循环键:

// you can keep the input variables
var a = 55;
var b = 13;
var c = 45;
var d = 5;

var obj = {
  a: a,
  b: b,
  c: c,
  d: d
}

var max;
var varName;

Object.keys(obj).forEach(function(key) {
  if (!max || max < obj[key]) {
    max = obj[key];
    varName = key;
  }
});

snippet.log(max);
snippet.log(varName);
<script src="https://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 2 :(得分:-1)

function high(obj) {
    var highest = Number.NEGATIVE_INFINITY,
      keyName = null;
    for (var key in obj) {
      if( obj[key] > highest ) {
        highest = obj[key];
        keyName = key;
      }
    }
  return keyName;
}

答案 3 :(得分:-1)

这样您就不必关心变量名。也不需要重复变量名。

function getTop(func){
    // init
    var obj={};
    var max=0,maxName="";
    var x={};
    for(var key in window){
      x[key]=window[key];
    }
    func();
    // select the max num
    for(var key in window){
      if(typeof(window[key]) == "number" && typeof(x[key])!="number"){
       if(window[key]>max){
         max=window[key];
         window[key]=undefined;
         maxName=key;
       }
      }
    }
    // output the variable name
    return maxName;
}

你可以写一个方法来重用:

var top=getTop(function(){
a=11;
b=22;
c=23;
d=14;
});

您可以使用代码获取顶级varname:

     tableview.delegate=self;
     tableview.datasource=self;

答案 4 :(得分:-3)

一种方法是,如果不能使用object,则获取最大值,然后将各个值检查为变量。在这里你不会有非常复杂的条件。同样,if...else if...elseif

更好

&#13;
&#13;
a = 55;
b = 13;
c = 45;
d = 5;

var max = Math.max(a,b,c,d);
var varName = "";

if(max === a){
  varName = "a";
}
else if(max === b){
  varName = "b";
}
else if(max === c){
  varName = "c";
}
else{
  varName = d;
}

alert(varName);
&#13;
&#13;
&#13;