我正在尝试将值与我的数组进行比较,但是,它不能正常工作。当值为安大略省时,应将其缩写为' 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'))
}
答案 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语句。