这是代码
converter =
{
'SIToImperial' :
{
'cm' : function(value) {return value * convertRatioImperial[0];},
'm' : function(value) {return value * convertRatioImperial[1];},
'km' : function(value) {return value * convertRatioImperial[2];},
'g' : function(value) {return value * convertRatioImperial[3];},
'kg' : function(value) {return value * convertRatioImperial[4];},
't' : function(value) {return value * convertRatioImperial[5];},
'mL' : function(value) {return value * convertRatioImperial[6];},
'L' : function(value) {return value * convertRatioImperial[7];},
'm3' : function(value) {return value * convertRatioImperial[8];},
'kWh' : function(value) {return value;},
'nb' : function(value) {return value;},
'undefined': function(value) {return 'Not Found';}
}
}
很明显,我的行'undefined'....不能像我想要的那样工作。
我希望调用转换器[“SIToImperial”] [单位]时,属性中未列出“单位”。例子:转换器[“SIToImperial”] ['oz']。 它应该返回未定义的行IE'Not Found'。
有人可以帮助我,但我尝试了各种各样的方法,但我仍然不熟悉字典,以使其正常工作。
更新:
//Generalized conversion function
function convert(value,valueUnit,system, toSI)
{
var result;
//From SI to Imp/U
if(!toSI)
{
result = converter.guardian('SITo'+system,valueUnit,value);
}
else if(toSI)//To SI from Imp/US
{
result = converter.guardian(system+'ToSI',valueUnit,value);
}
return result;
};
和
converter =
{
guardian : function (system,units,value) {var label = this[system][units]; if(typeof(label) === 'undefined') {return "Not Found";} else {return label(value);}},
'SIToImperial' :
{
'cm' : function(value) {return value * convertRatioImperial[0];},
'm' : function(value) {return value * convertRatioImperial[1];},
'km' : function(value) {return value * convertRatioImperial[2];},
'g' : function(value) {return value * convertRatioImperial[3];},
'kg' : function(value) {return value * convertRatioImperial[4];},
't' : function(value) {return value * convertRatioImperial[5];},
'mL' : function(value) {return value * convertRatioImperial[6];},
'L' : function(value) {return value * convertRatioImperial[7];},
'm3' : function(value) {return value * convertRatioImperial[8];},
'kWh' : function(value) {return value;},
'nb' : function(value) {return value;}
}
}
答案 0 :(得分:1)
不是一个非常好的解决方案,但又快捷方便:
var my_conv = converter.SIToImperial[units] || converter.SIToImperial["undefined"];
console.log(my_conv(value));
旁注:
converter[SIToImperial] // is probably wrong, you either mean:
converter["SIToImperial"] // or
converter.SIToImperial
答案 1 :(得分:1)
我不相信有办法在这里实现你的目标。您实际上是在尝试勾解要求成员不存在的情况。这样的钩子在javascript中不存在。相反,我认为你需要在这里使用一个包装类型
的函数converter =
{
'SIToImperial' :
{
...
getMember = function (name) {
var value = this[name];
if (typeof(value) === 'undefined') {
return 'Not Found'
}
return value;
}
}
答案 2 :(得分:0)
You can't do that。您不必在对象上定义“默认”属性,而是必须设置访问对象失败时的默认行为。您甚至不需要guardian
方法,可以在convert
函数中执行此操作:
function convert(value,valueUnit,system, toSI) {
return ( converter[ toSi
? system+'ToSI'
: 'SITo'+system
][valueUnit]
|| function() {
return 'Not Found';
}
) (value);
}
或
function convert(value,valueUnit,system, toSI) {
var units = converter[ toSi ? system+'ToSI' : 'SITo'+system ];
return valueUnit in units
? units[valueUnit](val)
: 'Not Found';
}