2015-09-25 30 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; 
}