Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 缺少值的字典_Javascript - Fatal编程技术网

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