Javascript 数组迭代

Javascript array iteration

本文关键字:迭代 数组 Javascript      更新时间:2023-09-26

我在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)正如其他人建议的那样,使用循环进行迭代for2)我的建议.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;   
    }
}