或者干脆使用if (states[state].indexOf(cityName) !== -1)
getStateByCityName(cityName) {
var statesRaw = sessionStorage.getitem('states');
var states = JSON.parse(statesRaw);
for (var state in states) {
if (states[state].indexOf(cityName) !== -1) {
return state;
}
}
return false;
}
或者在 EcmaScript 5 循环样式中:))
getStateByCityName(cityName) {
var statesRaw = sessionStorage.getitem('states');
var states = JSON.parse(statesRaw);
Object.keys(states).forEach(function(state) {
if (states[state].indexOf(cityName) !== -1) {
return state;
}
})
return false;
}
有很多方法(也请参见其他答案),所以让我们来看看性能。
首先遍历您的对象
http://jsperf.com/object-keys-vs-for-in-with-closure/3
在我的浏览器中最快的情况是Object.keys for loop
,所以
getStateByCityName(cityName) {
var statesRaw = sessionStorage.getitem('states');
var states = JSON.parse(statesRaw);
var states_keys = Object.keys(states);
for (var i = 0, l = states_keys.length; i < l; i++) {
// check if city exists
}
return false;
}
接下来我们需要检查该州是否存在城市。我看到了两种方法:1)其他人建议用for
循环迭代 2)我的建议.indexOf()
http://jsperf.com/js-for-loop-vs-array-indexof/2
在我的浏览器中indexOf()
得到了更好的结果,所以最终的功能
getStateByCityName(cityName) {
var statesRaw = sessionStorage.getitem('states');
var states = JSON.parse(statesRaw);
var states_keys = Object.keys(states);
for (var i = 0, l = states_keys.length; i < l; i++) {
if (states[states_keys[i]].indexOf(cityName) !== -1) {
return states_keys[i];
}
}
return false;
}
正如有人建议的那样try/catch
getStateByCityName(cityName) {
var states = {};
try {
states = JSON.parse(sessionStorage.getitem('states'));
} catch (e) {
}
var states_keys = Object.keys(states);
for (var i = 0, l = states_keys.length; i < l; i++) {
if (states[states_keys[i]].indexOf(cityName) !== -1) {
return states_keys[i];
}
}
return false;
}