是否有方法减少相同if语句的代码


var cl=[],di=[],sp=[],he=[];
for(var i=0;i<arg.length;i++){
    if(arg[i].slice(0,2)==='cl'){cl.push(arg[i])};
    if(arg[i].slice(0,2)==='di'){di.push(arg[i])};
    if(arg[i].slice(0,2)==='sp'){sp.push(arg[i])};
    if(arg[i].slice(0,2)==='he'){he.push(arg[i])};
}

这里我有4个if语句,它们是相同的,我如何减少代码

有很多方法可以做到这一点。以下是我知道的两种方法:

使用switch语句:

switch((arg[i].slice(0,2)) {
    case 'cl' : cl.push(arg[i]); break;
    case 'di' : di.push(arg[i]); break;
    case 'sp' : sp.push(arg[i]); break;
    case 'he' : he.push(arg[i]); break;
}

把你的数组放在一个对象中,并使用[]符号:

var cl=[],di=[],sp=[],he=[];
var map = {
    cl : cl,
    di : di,
    sp : sp,
    he : he
};
for(var i=0;i<arg.length;i++){
    var key = arg[i].slice(0,2);
    if (map[key]) map[key].push(arg[i])
}

并非如此,因为每个数组都有单独的变量。(虽然您可以使用switchif else来提高性能。)

但是,如果您将数组作为单个对象的一部分,则可以大大减少if语句代码。例如:

var myArrays = {
    cl: [],
    di: [],
    sp: [],
    he: []
};
function pusher(arg) {
    for (var i = 0; i < arg.length; i++) {
        // Check to ensure length is at least 2 characters.
        if(arg[i].length < 2)
            continue;
        var a = arg[i].slice(0, 2);
        // Check to ensure value exists in myArrays.
        if(myArrays[a])
            myArrays[a].push(arg[i]);
    }
}

当然,我已经添加了额外的验证,所以它结束了大量的行仍然。但它更容易重用,更适合您的场景。

下面是一个工作示例


如果你只有4个数组,那么这很好,但也许这是一个削减的例子?如果是这种情况,您可能需要考虑动态创建数组。举个简单的例子:

var myArrays = {};
myArrays['cl'] = [];
myArrays['di'] = [];
// etc... 

您可以使用此方法创建任意数量的列表,如果需要,甚至可以基于某些列表。

最新更新