将值与数组进行比较

时间:2015-07-14 18:02:01

标签: javascript arrays

我正在尝试将值与我的数组进行比较,但是,它不能正常工作。当值为安大略省时,应将其缩写为' ON'并且当在数组列表中找不到该值时,应该返回与放置它时相同的值。第一个警告框返回' Ontario'?我在这做错了什么:

function shorten(value) {

    var prov_states = [
        ['alberta','AB'],
        ['british Columbia','BC'],
        ['manitova','MB'],
        ['new brunswick','NB'],
        ['newfoundland and labrador','NL'],
        ['nova scotia','NS'],
        ['northwest territories','NT'],
        ['new brunswick','NB'],
        ['nunavut','NU'],
        ['ontario','ON'],
        ['prince edward island','PE'],
        ['quebec','QC'],
        ['saskatchewan','SK'],
        ['yukon','YT'],
        ['alabama','AL'],    
        ['alaska','AK'],
        ['arizona','AZ'],
        ['arkansas','AR'],
        ['california','CA'],
        ['colorado','CO'],
        ['connecticut','CT'],
        ['delaware','DE'],
        ['florida','FL'],
        ['georgia','GA'],
        ['hawaii','HI'],
        ['idaho','ID'],
        ['illinois','IL'],
        ['indiana','IN'],
        ['iowa','IA'],
        ['kansas','KS'],
        ['kentucky','KY'],
        ['louisiana','LA'],
        ['maine','ME'],
        ['maryland','MD'],
        ['massachusetts','MA'],
        ['michigan','MI'],
        ['minnesota','MN'],
        ['mississippi','MS'],       
        ['missouri','MO'],
        ['montana','MT'],    
        ['nebraska','NE'],
        ['nevada','NV'],
        ['new hampshire','NH'],
        ['new jersey','NJ'],
        ['new mexico','NM'],
        ['new york','NY'],
        ['north carolina','NC'],
        ['north dakota','ND'],
        ['ohio','OH'],
        ['oklahoma','OK'],
        ['oregon','OR'],
        ['pennsylvania','PA'],
        ['rhode island','RI'],
        ['south carolina','SC'],
        ['south dakota','SD'],
        ['tennessee','TN'],
        ['texas','TX'],
        ['utah','UT'],
        ['vermont','VT'],
        ['virginia','VA'],      
        ['washington','WA'],
        ['west virginia','WV'],
        ['wisconsin','WI'],
        ['wyoming','WY']            
        ]


  for (var i=0, iLen=prov_states.length; i<iLen; i++) {

    if (value.toLowerCase() == prov_states[i][0]) { return prov_states[i][1]; }

    else { return value }

  }
}


function test() {

alert(shorten('Ontario'))

alert(shorten('DC'))


}

5 个答案:

答案 0 :(得分:7)

您可能希望使用地图/关联数组而不是现在拥有的数组;用这种方式做起来容易得多。

var prov_states = {
    "alberta": "AB",
    "british columbia": "BC",
    ...
}

然后你可以这样做:

return prov_states[value.toLowerCase()];

您的特殊问题是因为您在找不到值时所做的事情:

else { return value }

这意味着如果第一场比赛不成功,您会立即返回value。相反,如果你根本找不到匹配,你应该这样做。

while循环应该有效:

var i = 0;
var state = null;
while(state === null && i < prov_states.length) {
    if(value.toLowerCase() === prov_states[i][0]) {
        state = prov_states[i][1];
    }

    i++;
}

return state === null ? value : state; //or just return state if you are okay with null

我看到的另一个问题是你的BC为"british Columbia",它永远不会匹配,因为你正在调用value.toLowerCase(),它会降低整个字符串。

答案 1 :(得分:2)

你的问题是这个

else { return value }

它会在第一次检查状态时返回,但它不匹配。

最简单的改变你可以做到以下

for (var i=0, iLen=prov_states.length; i<iLen; i++) {
    if (value.toLowerCase() == prov_states[i][0]) { 
        return prov_states[i][1]; 
    }    
}
return null;//or whatever you want to return when it is not found.

更好的实施将是这个我知道我是Vivin Paliath的忍者

var prov_states = {
    'alberta': 'AB',
    'british Columbia': 'BC'
};

...

alert(prov_states['Ontario'.toLowerCase()]);

答案 2 :(得分:0)

将else的return语句放在循环之外。删除其他。

for (var i=0, iLen=prov_states.length; i<iLen; i++) {
  if (value.toLowerCase() == prov_states[i][0]) return prov_states[i][1];
}
return value;

答案 3 :(得分:0)

return value语句移出for循环(以及else)。如果循环中的第一项不匹配,则代码当前正在返回提供的值。

for (var i=0, iLen=prov_states.length; i<iLen; i++)
{
    if (value.toLowerCase() == prov_states[i][0])
    {
        return prov_states[i][1];
    }
}
return value;

答案 4 :(得分:0)

数组的第一个值不等于Ontario。因此,第一次循环运行时,会调用else条件,返回value。你应该让循环看起来像这样:

for (var i=0, iLen=prov_states.length; i<iLen; i++) {
   if (value.toLowerCase() == prov_states[i][0]) { return prov_states[i][1]; }
}

return value;

在整个循环之后放置你的return语句。