在if else条件下切换语句,否则无法到达

时间:2014-08-06 02:31:21

标签: javascript if-statement switch-statement

这是我用来解析车辆VIN号码信息的条件的缩短版本。如果我传入一个像JA3XXXXXXXXXXXXXX这样的VIN,它返回并使用region的属性对象:'Asia';, country:'Japan';并制作:'五十铃';但如果我通过它2A5XXXXXXXXXXXXXX我会期望一个属性设置为区域的对象:'北美'; ,国家:'加拿大';并制造:'克莱斯勒';相反,我得到一个对象,其region属性设置为'Asia',就是这样。 Here是一个jsFiddle,代码如下所示。

var vehicle = {},
nthDigit = function (stringifiedVin, i) {
    var nthChar = stringifiedVin.charAt(i);
    return nthChar;
},
parseVin = function () {
    var i = 0;
    for (i = 0; i < 16; i += 1) {
        if (i === 0) {
            if (nthDigit(stringifiedVin, 0) === 'J' || 'K' || 'L' || 'M' || 'N' || 'P' || 'R') {
                vehicle.region = 'Asia';
                switch (nthDigit(stringifiedVin, i)) {
                case 'J':
                    vehicle.country = 'Japan';
                    switch (nthDigit(stringifiedVin, 1)) {
                    case 'A':
                        if (nthDigit(stringifiedVin, 2) === 'A' || 'B' || 'C' || 'D' || 'E' || 'F' || 'G' || 'H' || 'J' || 'K' || 'L' || 'M' || 'N' || 'P' || 'R' || 'S' || 'T' || 'U' || 'V' || 'W' || 'X' || 'Y' || 'Z') {
                            vehicle.make = 'Isuzu';
                        } else if (nthDigit(stringifiedVin, 2) === '3' || '4' || '5' || '6' || '7') {
                            vehicle.make = 'Mitsubishi';
                        } else {
                            vehicle.make = 'Not Read';
                        }
                        break;
                   }         
                   break;
               }
           } else if (nthDigit(stringifiedVin, 0) === '1' || '2' || '3' || '4' || '5') {
               vehicle.region = 'North America';
               if (nthDigit(stringifiedVin, 0) === '2') {
                   vehicle.country = "Canada";
                   switch (nthDigit(stringifiedVin, 1)) {
                   case 'A':
                       if (nthDigit(stringifiedVin, 2) === '2' || '3' || '4' || '5' || '6' || '7' || '8') {
                           vehicle.make = 'Chrysler';
                       } else {
                           vehicle.make = 'Not Read';
                       }
                       break;
                   }
                   break;
               }
           }
           return vehicle; 
        }
   }
}

3 个答案:

答案 0 :(得分:1)

我不是||零件以您认为的方式工作。这将运行Alert(),因为'2'不是假的:

if ('A' === '1' || '2') 
    alert('match')

我会使用开关,否则您必须拼写出来:

var nd = nthDigit(stringifiedVin, 0);
if (nd === 'J' || nd === 'K' ||  nd === 'L' ||  ...

答案 1 :(得分:0)

较短的一个:

 if("JKLMNP".indexOf(nthDigit(stringifiedVin, 0)) > -1){
        //....
 }

答案 2 :(得分:0)

@JBrooks我认为你对双管道或运算符如何在条件语句中造成麻烦是正确的。我认为这是由于操作员处理假值的方式,如this SO帖子所示。当我意识到JA3XXXXXXXXXXXXXX应该返回三菱而不是五十铃时,我最终完全摆脱了if语句。我在设置多个案例时使用@KennyTM答案找到了解决方案here