2015-01-16 3 views
0

У меня есть массив JavaScript в sessionStorage и когда я делаю sessionStorage.getitem('states'), я получаю так:Javascript массив итерация

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

Теперь мое требование, чтобы получить название штата от названия города. Например, если я передаю "Mumbai" функции в качестве параметра, эта функция должна прочитать значение sessionstorage и вернуть мне "Maharashtra".

Не могли бы вы помочь мне в достижении этого?

+0

Hello Manwal, я в значительной степени новичок в программировании на javascript. Я только начал учиться. Так что я не очень старался, так как не был уверен, что делать. –

+0

nit-pick: у вас нет массива, у вас есть строка JSON, что при повторном анализе будет задан _объект_. Объект не совпадает с массивом –

+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()

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

Спасибо Арунас Смалюкас за то, что он дал мне всю эту информацию. Я последую за ними. –