缺失值的字典

时间:2013-07-30 15:27:21

标签: javascript

这是代码

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

3 个答案:

答案 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';
}