2013-09-04 1 views
2

моя проблема заключается в том, что у меня есть json-object with и array в качестве примера.Значение доступа от объекта JavaScript через массив-строку

var object = { 
'items':['entry1','entry2'] 
} 

Я хочу получить доступ к 'entry2' по постоянной строке, которую я получаю и не должен быть изменен.

var string = 'items[1]'; 

Единственный способ, которым я решить эту проблему через функцию Eval ...

eval('object.'+string); 

Это возвращает меня entry2.

Есть ли другой способ достичь этого без использования eval()? Как object[string] или object.string

+0

Каковы возможные значения 'string'? –

+0

в этом случае 'items [0]' или 'items [1]' – marius

ответ

3

, предполагающей ваша строка всегда та же форма, вы можете извлечь его частей, используя регулярное выражение:

var m = string.match(/(\w+)\[(\d+)\]/); 
var item = object[m[1]][+m[2]]; 

Пояснение :

Регулярное выражение создает две группы:

(\w+) : a string 
\[(\d+)\] : some digits between brackets 

и эти группы с индексом 1 и 2 массива, возвращаемого match.

+something анализирует число. Здесь строго не требуется, поскольку массив принимает строку, если она может быть преобразована, но я нахожу код более читаемым, когда это преобразование объясняется.

+0

Могу ли я узнать, почему мой ответ был приостановлен? –

+0

это решение, но я, кажется, не понимаю его правильно. В любом случае, это работает, и я должен проверить, как работает этот метод. Thx :) – marius

+0

@marius Я объяснил регулярное выражение, это ясно сейчас? –

-1

попробовать что-то вроде этого

object.items[1]; 
+1

это невозможно, поскольку элементы [1] получены в виде строки ... это моя проблема ... – marius

+0

@marius вы пробовали это http:// jsfiddle.net/rajesh007/PqXQD/ –

+0

, как я сказал ранее, элементы [1] принимаются в виде строки из запроса, поэтому это не статический код. Это строка = 'items [1]' – marius

0

Во-первых, вы можете получить массив внутри:

var entries = object.items // entries now is ['entry1','entry2'] 

Затем вам нужно индексировать, что, чтобы получить второй элемент (в положении 1). Таким образом, вы добиться того, что вы хотите с:

var answer = entries[1] // answer is now 'entry2' 

Конечно, вы можете совместить это, чтобы получить как сделано в одном шаге:

var answer = object.items[1] // answer is now 'entry2' 

... Я могу видеть, что это надуманный пример, но пожалуйста, не называйте свои объекты «объект», или ваши строки «строка»: ■

+0

это было просто для понимания;), но я почитаю ваш совет – marius

1

на вершине dystroy's anwser, вы можете использовать эту функцию:

function getValueFromObject(object, key) { 
    var m = key.match(/(\w+)\[(\d+)\]/); 
    return object[m[1]][+m[2]]; 
} 

Пример:

var object = { 
'items':['entry1','entry2'] 
} 

var string = 'items[1]'; 

var value = getValueFromObject(object, string); //=> "entry2" 
+0

dystroy's and your solution is right thx :) – marius

+1

Это действительно что-то добавляет к моему ответу? –

Смежные вопросы