Javascript 数组/对象作为索引

Javascript 数组/对象作为索引,javascript,jquery,arrays,Javascript,Jquery,Arrays,在jQuery ajax请求中,我使用回调进行了错误处理: success: function(a) { if (a.error) switch (a.error) { case "formError": case "clientError": case "limitError": doErrorCorrection(); alert("Client-sided error: " + a.errorMessage);

在jQuery ajax请求中,我使用回调进行了错误处理:

success: function(a) {
    if (a.error) switch (a.error) {
    case "formError":
    case "clientError":
    case "limitError":
        doErrorCorrection();
        alert("Client-sided error: " + a.errorMessage);
        break;
    case "serverError":
    case "500Error":
        doRollback();
        doTransactions();
        break;
    case "generalError":
        alert("One plus one is: " + (1+1));
    } else doActionsWith(a)
}
我想将其移动到它自己的对象中,例如:

var errors = {
    ...
    formError: function() {...},
    generalError: function() {...},
    ...
};
有了这些,我可以说:

success: function(a) {
    if (a.error) return errors[a.error](a.errorMessage);
    doActionsWith(a)
}
问题是,我有大量的回流从开关,如果我要翻译成一个对象,这将意味着重复相同的功能一遍又一遍

var errors = {
    formError: function() { methodA() },
    clientError: function() { methodA() },
    limitError: function() { methodA() },
    ...
    //more if I had more reflows
};
因此,我考虑使用数组/列表作为索引。我胡乱设置了一个索引,比如:

var arr = {
    test: 'hello world'
};

var index = ['a', 'b', 'c'];

arr[index] = 'array as index';
它奏效了,但只是部分奏效。当我运行这些键时,它们以字符串的形式返回:

for (var key in arr) console.log(key)
//test
//a,b,c
对对象运行相同的测试,
index={'a'=true}
仅将字符串index
object对象
设置为
数组作为索引


好的,作为索引的数组/对象将不起作用,我应该如何将我的开关重新构造为对象?

当您使用数组作为对象属性名称时,它们将转换为字符串等价物,因此
[1,2,3]
用作
“1,2,3”
;它不会像“如果值是这些值中的任何一个”那样工作

对于您的特定问题,我将创建一个专用的错误处理程序对象,如下所示:

function ErrorHandler(map, handlers)
{
    this.map = map;
    this.handlers = handlers;
}

ErrorHandler.prototype.handle = function(a) {
    var handler = this.handlers[this.map[a.error]];

    if (handler) {
        handler(a);
    }
}
构造函数获取错误映射和处理函数;调用
.handle()
时,它将找到处理程序并运行它。这是您实例化它的方式:

var myHandler = new ErrorHandler({
    "formError": "clientError",
    "clientError": "clientError",
    "limitError": "clientError",
    "serverError": "serverError",
    "500Error": "serverError"
    "generalError": "genericError"
}, {
    clientError: function(a) {
        doErrorCorrection();
        alert("Client-sided error: " + a.errorMessage);
    },
    serverError: function(a) {
        doRollback();
        doTransactions();
    },
    genericError: function(a) {
        alert("One plus one is: " + (1+1));
    }
});
要使用它:

success: function(a) {
    if (a.error) {
        myHandler.handle(a);
    } else doActionsWith(a)
}

您可以维护这样的对象数组:

var arr = [{ 
    msg: 'Hello World',
    val: ['a', 'b', 'c']
}, {
    msg: 'This is a dummy text.',
    val: ['d', 'e', 'f']
}];

// now perform your search
for (var obj in arr) {
    var idx = arr[obj].val.indexOf('a');
    if (idx !== -1) { // if val is found
        alert(arr[obj].msg);    // alerts "Hello World"
    }
}

请注意,
{formError:function(){methodA()}}
{formError:methodA}
相同,我不清楚您在问什么
for..in
loop对对象键有效,但对对象无效?顺便说一句,您的第二个对象
index={'a'=true}
不正确,应该是
index={'a':true}
它们在两个测试中都不起作用。返回的键是字符串文本。似乎对象键被规范化为字符串。@DaveChen对象键始终是字符串。为了防止范围内的污染,我设计了如下内容。问题是,我需要说
formError:function(){this.methods.clientError()}
,这将是太多的重复。@DaveChen更新了答案以突出显示另一个选项。要防止当前范围内的污染,只需使用如下闭包:。无需过度重复。我将
msg
更改为
handler
,将
val
更改为
handles
+1&接受。