【问题标题】:Javascript array iterationJavascript数组迭代
【发布时间】:2015-03-14 21:53:27
【问题描述】:

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

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

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

你能帮我实现这个吗?

【问题讨论】:

  • 你好 Manwal,我几乎是 javascript 编程的新手。我刚开始学习。所以没有尝试太多,因为我不知道该怎么做。
  • nit-pick:你没有数组,你有一个 JSON 字符串,当被解析时会产生一个 object。对象与数组不同
  • 非常感谢您在很短的时间内提供的所有答案。我非常感激。我尝试了“Pavel”和“belhyk”的代码,它给了我预期的结果。就一个问题。将来 json 字符串会增长很多并包含大量数据,下面给出的这些答案中的任何一个都应该有效,不是吗?
  • 所有答案都有效。但是,如果您的 json 会增长,我建议您查看性能(请参阅下面的答案)。祝你好运

标签: javascript json sessionstorage


【解决方案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;

【讨论】:

  • 非常感谢您在很短的时间内提供的所有答案。我非常感激。我尝试了代码,它给了我预期的结果。就一个问题。将来 json 字符串会增长很多并包含大量数据,下面给出的这些答案中的任何一个都应该有效,不是吗?
【解决方案2】:
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;
}

【讨论】:

  • 如何遍历字符串?
  • 你必须做一个 JSON.parse
  • 我添加了对字符串的解析
  • 在我看来,在不真正处理错误的情况下添加 try...catch 并没有多大好处。您只是真正“隐藏”了错误,这意味着您无法区分由于某种原因无法读取状态数据以及何时要求不存在 cityName。
  • try...catch for "JSON.parse" 是这个函数的最小处理
【解决方案3】:

应该可以,但无法测试:

function (arrayTarget, itemToSearch){
    for (x in arrayTarget) {
        for(y in arrayTarget[x])
            if(itemToSearch == arrayTarget[x][y])
                 return x;   
    }
}

【讨论】:

    【解决方案4】:

    或者干脆使用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;
    }
    

    【讨论】:

    • 感谢 Arūnas Smaliukas 为我提供了这方面的大量信息。我会遵循这些。
    猜你喜欢
    • 2021-06-05
    • 1970-01-01
    • 2017-03-29
    • 2018-04-06
    • 2019-02-27
    • 2017-12-17
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多