数组/对象作为索引

时间:2013-08-26 08:05:52

标签: 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);
        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)
}

问题是我有很多来自switch的回流,如果我要把它转换成一个对象,那就意味着一遍又一遍地重复相同的功能。

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}仅将字符串索引object Object设置为array as index

好的,所以作为索引的数组/对象不起作用,我应该如何将我的开关重组为一个对象?

2 个答案:

答案 0 :(得分:1)

当您使用数组作为对象属性名称时,它们会变成等效的字符串,因此[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)
}

答案 1 :(得分:1)

您可以维护一系列对象:

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"
    }
}