2015-09-25 68 views
-1

我希望我能夠明確我的問題。 我有幾個對象,我用名爲address的屬性創建。例如,Obj1具有地址0x0000,Obj2具有地址0x0004等等。 有一個我需要處理的隨機輸入地址列表。一旦輸入地址是對象地址之一(如果addr = 0x0000 || addr = 0x0004 ....),則會自動加載一個函數。 目前,我正在比較它的對象地址列表,我認爲這是浪費迭代。有沒有辦法,我可以通過索引訪問它?例如,一旦我輸入一個輸入地址0x0004,函數將直接運行。使用if ... else來比較對象屬性的替代方案

編輯:感謝所有的答案:)我有一個清晰的概念,現在

+0

也許你想看'case' – Manu

+2

也許字典/目的? '{'0x000':function(){..},..} [addr]()'? – deceze

+2

如果您提供一些示例代碼,情況會更加清晰。 – fuyushimoya

回答

3

你有兩個選擇:

使用開關來定義的所有功能:

switch (input){ 
case '0x0000': function(input){}; break; 
case ... 
} 

使用預定義的地圖:

var functionMappings = { 
    '0x0000': function_1, 
    '0x0001': function_2, 
}; 

if(functionMappings[input]) { 
    functionMappings[input](input); 
} 

我寧願第二個例子,因爲它可以創造在運行時動態編輯。

更新: 你可以這樣創建functionMappings dynamicaly:

var functionMappings = {// create first entries, or defualt functions 
    '0x0001': function_1, 
    '0x0002': function_2 
}; 

if(condition_x) { // add new or overwrite existing functions 
    functionMappings[0x0005] = function_5; 
} 

因爲這是一個地圖,你甚至可以覆蓋默認功能定義,如果你需要。

+0

是的,我想分配一個功能字典鍵(我忘了刪除支柱:)) – Beri

+1

你可能需要''0x0000':function_1'自0x0000!=='0x0000'。 – RobG

+0

好點,但不是十六進制數字,我們應該使用十進制或字符串名稱,它們會更清晰可讀。 – Beri

0

迭代一次,並把所有的地址作爲鍵的對象:

var addresses = {}; 
for(var i=0;i<objList.length;i++){ 
    addresses[objList[i].addr] = {}; 
    addresses[objList[i].addr].fn = correspondingFunction 

    // you can even attach the corresponding object to it 
    // addresses[objList[i].addr].obj = addresses[objList[i].addr]; 
} 

我使用一個循環的例子,但你可以做到這一點適合你

那麼你有什麼辦法您的對象列表中的地址鍵入,您可以通過它獲取它們:

function getAddrFunction(addr){ 
    if(addresses[addr] !== undefined){ 
     return addresses[addr].fn; 
    } 
    return null; 
}