我需要一种方法来获取具有最大值的变量的名称。
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'; }
有更好或更快的方法吗?
答案 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...else
比if
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;