Javascript 缺少值的字典
这是密码Javascript 缺少值的字典,javascript,Javascript,这是密码 converter = { 'SIToImperial' : { 'cm' : function(value) {return value * convertRatioImperial[0];}, 'm' : function(value) {return value * convertRatioImperial[1];}, 'km' : function(value) {return value
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';}
}
}
很明显,我的行“未定义”。。。。不像我希望的那样工作
我希望在调用converter[“SIToImperial”][units]时,属性中未列出“units”。例如:转换器[“现场材料”]['oz']。
它应该返回未定义的行,即“未找到”
有人能帮我吗?我已经尝试了各种方法,但我对词汇表还不够熟悉,无法让它正常工作
更新:
//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;
};
及
这不是一个很好的解决方案,但快速简单:
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
。当访问对象失败时,您必须设置默认行为,而不是在对象上定义“默认”属性。您甚至不需要guardian
方法,您可以在convert
功能中正确执行:
function convert(value,valueUnit,system, toSI) {
return ( converter[ toSi
? system+'ToSI'
: 'SITo'+system
][valueUnit]
|| function() {
return 'Not Found';
}
) (value);
}
或
我认为在这里没有办法实现你的目标。您实际上是在尝试钩住一个不存在的成员请求的情况。javascript中不存在这样的钩子。相反,我认为您需要在这里使用一个函数来包装类型
converter =
{
'SIToImperial' :
{
...
getMember = function (name) {
var value = this[name];
if (typeof(value) === 'undefined') {
return 'Not Found'
}
return value;
}
}
为什么不让SIToImperial函数把它作为参数呢?调用converter.SIToImperial('cm',2)然后调用converter['SIToImperial']['cm'](2)或converter.SIToImperial['cm'](2)或converter.SIToImperial.cm(2)更有意义,因为我从视图到模型,从模型到视图进行包装。当我调用包装器时,它看起来像convertToView(value,unit)或convertToModel(value,unit),你是对的,我指的是converter[“SIToImperial”]和converter.SIToImperial,测试它的方法在对象之外,所以我需要在代码中的任何地方,另外,我很确定在返回我的_conv之前,is会崩溃,因为如果没有定义该单元,它会生成一个错误,因此不会返回任何结果来执行if-clause@Fawar:如何定义
单位
?我们认为您的问题是,单位
是定义的,但有一个值,而对象没有属性。@Fawar:正如我在回答中所说,您总是需要在对象之外进行测试-没有其他方法,所有三个发布的答案都可以。我的问题您是对的。我在评论中错误地解释了我的意思。很抱歉我想在转换后的对象内部进行测试,看到了关于如何进行测试的更新细节。我不太确定是否理解第二个代码示例的语义?对我来说像是一个if,但我从来没有这样用过O无论如何,它与Fritz Van Campen的回答存在相同的问题使用您的解决方案,我需要添加一个函数,在访问之前测试接收到的单元(如果存在)?就是这样。在目前的情况下,这意味着我对该结构所做的每一个调用都需要一个更新来完成“包装”功能。它会工作,但在我的情况下,我怀疑它是一个好方法,因为我不是“开始”使用该系统,它已经被使用了很多。@Fawar你的分析是正确的。不过,我认为您需要在这里更新一些方式。根本没有办法在[]
表达式中钩住缺少值的情况。如果你希望解决方案是通用的,那么它将涉及以某种方式改变所有呼叫站点该死的,我希望不会出现这种情况。我将看看如何绕过这个问题,因为我已经有了一些包装器,可以很容易地将您的解决方案添加到其中object@Fawar:如果您已经有一个包装器,您可以轻松地将其集成到那里。不需要在每个数据对象上都放置一个方法。该对象从不实例化,它是一种静态库对象。
function convert(value,valueUnit,system, toSI) {
var units = converter[ toSi ? system+'ToSI' : 'SITo'+system ];
return valueUnit in units
? units[valueUnit](val)
: 'Not Found';
}
converter =
{
'SIToImperial' :
{
...
getMember = function (name) {
var value = this[name];
if (typeof(value) === 'undefined') {
return 'Not Found'
}
return value;
}
}