使用if ... else比较对象属性的替代方法

时间:2015-09-25 08:06:29

标签: javascript

我希望我明白我的问题。 我有一些使用名为address的属性创建的对象。例如,Obj1的地址为0x0000,Obj2的地址为0x0004,依此类推。 我需要处理一个随机输入地址列表。一旦输入地址是对象地址之一(如果addr = 0x0000 || addr = 0x0004 ....),则会自动加载一个函数。 目前,我正在通过一个Object地址列表对它进行比较,我认为这是浪费迭代。有什么办法,我可以通过索引访问它吗?例如,一旦我输入0x0004的输入地址,就会直接运行一个函数。

编辑:感谢您的所有答案:)我现在有一个更清晰的想法

2 个答案:

答案 0 :(得分: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;
}

因为这是一张地图,所以如果需要,你甚至可以覆盖默认的功能定义。

答案 1 :(得分: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;
}