Javascript 数组迭代
Javascript array iteration
我在sessionStorage
中有一个JavaScript数组,当我做一个sessionStorage.getitem('states')
时,我得到这样的:
"{
"TamilNadu": [
"Chennai",
"Trichy",
"Madurai"
],
"Andhra": [
"Hyderabad",
"Vizhag"
],
"Karnataka": [
"Bangalore",
"Mysore",
"Darwad"
],
"Maharashtra": [
"Mumbai",
"Pune"
]
}"
现在我的要求是从城市名称中获取州名称。例如,如果我将"Mumbai"
作为参数传递给一个函数,则该函数应该读取此sessionstorage
值并返回我"Maharashtra"
。
你能帮我如何实现这一目标吗?
此代码:
sessionStorage.getitem('states')
返回一个字符串。您必须使用以下方法解析它:
var obj = JSON.parse(sessionStorage.getitem('states'))
接下来是带有方括号或点的访问对象属性:
for (var attr in obj) {
if (obj.hasOwnProperty(attr) && obj[attr][0] == 'Mumbai') {
return attr;
}
}
return null;
function getStateByCityName (cityName) {
var states = {};
try {
states = JSON.parse(sessionStorage.getitem('states'));
} catch (e) {
}
for (var state in states) {
for (var i = 0; i < states[state].length; i ++) {
if (states[state][i] == cityName)
return state;
}
}
return null;
}
或者干脆使用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;
}
这应该有效,但无法测试它:
function (arrayTarget, itemToSearch){
for (x in arrayTarget) {
for(y in arrayTarget[x])
if(itemToSearch == arrayTarget[x][y])
return x;
}
}
相关文章:
- 如何在DataTables 2.1中迭代对象数组
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- 如何在Jquery中迭代JSON数组
- 为什么数组在对象内部迭代对象时存储重复值
- 迭代和修改Firebase数组会导致未定义
- 在对象上迭代以验证它是否's键存在于数组中
- 在JSON数组中进行迭代,并为其元素设置样式
- 我需要迭代一个JSON数组——不知道如何做到——已经搜索过了,但仍然可以'我一点也不知道
- JavaScript:如何在迭代过程中修改数组中的值
- 使用Ruby数组使用JS在视图中进行迭代和显示
- 使用javascript在数组中迭代和映射JSON
- 在数组中迭代时的JS循环位置
- 在可变长度d3的多维数组上迭代
- MVC:使用Web窗体视图引擎在javascript中迭代Viewbag数组
- 如何通过迭代对象数组来删除某些项目
- 如何在 JavaScript 中动态地编写可迭代的函数数组
- 使用节点在 JSON 数组中搜索项目(最好不迭代)
- 使用 promises/dedelay 异步迭代一组文件
- 不能让.offset()方法在迭代一组列表项时工作
- 迭代2个数组并找到匹配,但需要相同的索引