2013-07-30 79 views
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';} 
    } 
} 

很顯然,我行「未定義」 ....不喜歡的工作,我希望它。

我想,當轉換器[「SIToImperial」] [單位]與'單位'未列在屬性中調用。例如:converter [「Sito'mperial」] ['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; 
}; 

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

你爲什麼不使SIToImperial函數的類型以此爲參數,使用功能 - 它甚至更有意義調用converter.SIToImperial(「CM」 ,2)然後轉換器['SIToImperial'] ['cm'](2)或converter.SIToImperial ['cm'](2)或converter.SIToImperial.cm(2) – Hurda

+0

我有一個包裝功能,因爲我從視圖到模型以及從模型到視圖的換行。當我打電話給包裝它看起來像這樣 convertToView(值,單位)或convertToModel(值,單位) – Fawar

回答

1

我不相信有一種方法可以在這裏實現自己的目標。你基本上試圖勾起那個不存在的成員被要求的情況。這樣的鉤子不存在於JavaScript中。相反,我認爲你需要在這裏換行

converter = 
{ 
    'SIToImperial' : 
    { 
     ... 
     getMember = function (name) { 
      var value = this[name]; 
      if (typeof(value) === 'undefined') { 
      return 'Not Found' 
      } 
      return value; 
    } 
} 
+0

使用您的解決方案,我需要補充的是將測試功能如果它存在,在訪問它之前收到該單元?就是這樣。 在當前情況下,這意味着我對該結構進行的每次單獨調用都需要更新才能通過該「包裝」功能。它會工作,但在我的情況下,我懷疑這是做這件事的好方法,因爲我沒有「開始」使用該系統,它已經被很多人使用。 – Fawar

+0

@法爾你的分析是正確的。不過,我認爲你需要在這裏更新一些方式。根本沒有辦法在'[]'表達式中掛鉤缺少的值。如果您希望解決方案具有普遍性,則需要更改所有呼叫站點的方式 – JaredPar

+0

該死的,我希望它不會出現這種情況。我會看看如何繞過這個問題,因爲我已經有了一些包裝器,所以很容易在你的解決方案中添加你的解決方案。 – Fawar

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 
+0

你是對的我的意思是轉換器[「SIToImperial」]和converter.SIToImperial – Fawar

+0

這種測試方式是在對象之外,所以我需要把它放在我的代碼中的任何地方,再加上我很確定這會在返回my_conv之前崩潰,因爲如果未定義該單元,它會生成一個錯誤,因此不會返回結果來執行if-子句 – Fawar

+0

@Fawar:單元怎麼不被定義?我們雖然你的問題是'units'被定義了,但是有一個你的對象沒有屬性的值。 – Bergi

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'; 
} 
+0

我不太清楚第二個代碼的語義例句嗎?看起來像是對我來說,但我從來沒有用過這種方式?:o無論如何,它同樣有這樣的問題,因爲弗裏茨·範·坎彭的回答 – Fawar

+1

http://stackoverflow.com/questions/1771786/question-mark-in-javascript – Bergi