0

这是代码

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;}
    }
}
4

3 回答 3

1

我不相信有办法在这里实现你的目标。您实际上是在尝试挂钩不存在要求成员的情况。javascript 中不存在这样的钩子。相反,我认为您需要在这里使用一个包装类型的函数

converter = 
{
    'SIToImperial' : 
    {
        ... 
        getMember = function (name) {
          var value = this[name];
          if (typeof(value) === 'undefined') { 
            return 'Not Found'
          }
          return value;
    }
}
于 2013-07-30T15:34:02.437 回答
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
于 2013-07-30T15:30:35.393 回答
0

你不能那样做。您必须为访问对象失败时设置默认行为,而不是在对象上定义“默认”属性。你甚至不需要一个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';
}
于 2013-07-30T15:33:28.277 回答