0

我有一个 JavaScript 数组sessionStorage,当我执行 a 时sessionStorage.getitem('states'),我会变成这样:

"{
    "TamilNadu": [
        "Chennai", 
        "Trichy", 
        "Madurai"
    ],
    "Andhra": [
        "Hyderabad",
        "Vizhag"
    ],
    "Karnataka": [
        "Bangalore",
        "Mysore",
        "Darwad"
    ],
    "Maharashtra": [
        "Mumbai",
        "Pune"
    ]
}"

现在我的要求是从城市名称中获取州名称。例如,如果我"Mumbai"作为参数传递给一个函数,该函数应该读取这个sessionstorage值并返回 me "Maharashtra"

您能帮我实现这一目标吗?

4

4 回答 4

1
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;
}
于 2015-01-16T10:10:32.087 回答
1

或者干脆使用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;
}
于 2015-01-16T10:20:01.723 回答
1

这段代码:

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;
于 2015-01-16T10:05:16.573 回答
0

那应该可以,但无法测试:

function (arrayTarget, itemToSearch){
    for (x in arrayTarget) {
        for(y in arrayTarget[x])
            if(itemToSearch == arrayTarget[x][y])
                 return x;   
    }
}
于 2015-01-16T10:11:07.217 回答