2015-01-16 94 views
0

我在sessionStorage JavaScript陣列,當我做了sessionStorage.getitem('states'),我得到這樣的:Javascript數組迭代

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

現在,我的要求是從城市名獲得國家名稱。 例如,如果我將"Mumbai"作爲參數傳遞給函數,則該函數應該讀取此sessionstorage值並返回給我"Maharashtra"

你能幫我解決這個問題嗎?

+0

你好Manwal,我幾乎是一個JavaScript編程的新手。我剛開始學習。所以沒有多少嘗試,因爲我不知道該怎麼做。 –

+0

nit-pick:你沒有數組,你有一個JSON字符串,當解析時會產生一個_object_。一個對象與數組不一樣 –

+0

非常感謝您在很短的時間內給出的所有答案。我非常感謝。我嘗試了「Pavel」和「belhyk」的代碼,並按預期給我提供了結果。只是一個問題。在將來,json字符串會增長很多幷包含如此多的數據,下面給出的這些答案中的任何一個都應該起作用,不是嗎? –

回答

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; 
+1

非常感謝您在很短的時間內爲您解答所有問題。我非常感謝。我嘗試了代碼,並且它按預期給我提供了結果。只是一個問題。在將來,json字符串會增長很多幷包含如此多的數據,下面給出的這些答案中的任何一個都應該起作用,不是嗎? –

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; 
} 
+1

如何迭代字符串? – DontVoteMeDown

+0

你必須做一個JSON.parse –

+0

我已經添加了一個字符串的解析 – belykh

0

這應該工作,但不能對其進行測試:

function (arrayTarget, itemToSearch){ 
    for (x in arrayTarget) { 
     for(y in arrayTarget[x]) 
      if(itemToSearch == arrayTarget[x][y]) 
       return x; 
    } 
} 
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()建議.indexOf()

http://jsperf.com/js-for-loop-vs-array-indexof/2 得到更好的效果,所以最終的功能

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; 
} 
+0

謝謝ArūnasSmaliukas爲我提供了關於此的大量信息。我會遵循這些。 –