Or simply use 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;
}
Or in EcmaScript 5 loop style :))
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;
}
There are many ways (see other answers too) so let's take a look at performance.
First to iterate through your object
http://jsperf.com/object-keys-vs-for-in-with-closure/3
In my browser fastest case was Object.keys for loop, so
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;
}
Next we need to check if city exists in that state. I see two ways to do it:
1) as others suggested iterate with for loop
2) mine suggested .indexOf()
http://jsperf.com/js-for-loop-vs-array-indexof/2
in my browser indexOf() got better results, so final function
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;
}
And as some one suggested use 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;
}