2015-01-07 2 views
0

Как можно ссылаться на объект элемента динамически во время цикла с помощью массива, что-то вроде этого:объектов JavaScript с помощью массива

var obj = {}; 
var lvl = ['x','y','z']; 
var ol = []; 
for (var l in lvl){ 
    ol.push(lvl[l]) 
    obj[ol] = 'someval' 
} 

так где ссылка может быть OBJ [х] [Y] [ z], поэтому каждый раз, когда цикл повторяется, добавляется дополнительная ссылка на ключ, но я не знаю, сколько уровней будет.

Не уверен, что я объяснил это очень хорошо?!

+0

Вы уверены, что хотите этого? 'obj [ol]' это сохранит массив как ключ объекта. или вы хотите 'obj [ol [l]]'. – Mritunjay

+0

Я хочу динамически добавлять [] каждый раз, когда цикл повторяется, поэтому в конце этого примера ссылка будет obj [x] [y] [z]. – crankshaft

+0

Итак, просто чтобы быть понятным, вы хотите obj [x] [y] [z] = "someval". По существу вложенные ключи объектов? – yoleg

ответ

0

Вы хотите сказать, что someval является значением obj.x.y.z? Вы всегда можете обратиться к вновь созданным уровням с использованием переменного:

var obj = {}; 
var levels = ['x','y','z']; 

var pointer = obj; 

for (var l=0; l<levels.length; l++) { 
    key = levels[l]; 

    if (l < levels.length-1) { // if not last element 
     pointer[key] = {}; 
     pointer = pointer[key]; 
    } 
    else {      // if last element 
     pointer[key] = 'someval'; 
    } 
} 

console.log(obj); // should log {x:{y:{z:"someval"}}} 
+0

ОК. Наконец, он работал. Помните, что переменные являются ссылками только тогда, когда они указывают на массивы или объекты. Но они являются значениями, когда вы назначаете им строку или номер .. arrrrgh ... – slebetman

1

На основании того, как вы ответили на мой комментарий Я считаю, что этот код обеспечит вложенную структуру объекта, который вы ищете.

var obj = {}; 
var lvl = ['x','y','z']; 
var ol = {}; 

for (var i = 0; i < lvl.length; i++){ 
    obj[i] = {}; 
    ol = obj[key]; 
} 
+0

бит 'var key в lvl' неверен, потому что он даст вам« 0,1,2, length' not 'x, y , z'. Обнаружил трудный путь при тестировании моего собственного ответа. Используйте foreach или регулярный цикл 'for (x = 0; x slebetman

+0

В качестве альтернативы вы можете изменить 'lvl' как' {x: '', y: '', z: ''} 'вместо массива. – slebetman

+0

Правильно, потому что это массив ... – yoleg

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