2016-08-27 2 views
0

У меня есть яваскрипта предмет, похожийКак назначить под-объект переменной в javascript?

var obj = { 
    p1: { 
     name: "name1", 
     age: "age1" 
    } 
    p2: { 
     name: "name2", 
     age: "age2" 
    } 
} 

Я хочу, чтобы иметь возможность доступа имя и возраст итеративно, а это означает что-то вроде этого:

for (var p in obj) { 
    if (obj.hasOwnProperty(p)) { 
     func1(p.name); 
     func2(p.age); 
    } 
} 

Однако p.name показан как " undefined "в отладчике, так же как и другие ключи p. Интересно, позволяет ли javascript пользователям назначать под-объект для новой переменной, как в Python.

ответ

1

Я думаю, что вам что-то не хватает. Посмотрите:

for (var p in obj) { 
    if (obj.hasOwnProperty(p)) { 
     func1(obj[p].name); 
     func2(obj[p].age); 
    } 
} 

Это должно сработать.

p существует только как свойство obj так, даже внутри for-in цикла, вы должны получить доступ к p как свойство obj (из цикла).

Если вы изучаете javascript, это может быть не очевидно, но есть два способа доступа к свойствам объекта: точечная нотация и квадратная скобка. Используя ваш пример, obj.p1.name === obj['p1']['name].

Иногда вам нужна квадратная скобка, потому что вы хотите передать ей какую-то переменную, которая вам нужна внутри цикла for-in.

Я надеюсь, что это ясно. Если нет, вы можете увидеть, что это работает над этим JSBin

1

Ваш вложенный объект строго отформатирован (имеет имя, возраст во всех вложенных элементах).
Также в чем причина, чтобы проверить, что это hasOwnProperty?
Вы перебираете объект по ключам и не знаете, что он имеет iterator key?

Почему бы просто не просто перебрать объект?

var obj = { 
 
    p1: { 
 
     name: "name1", 
 
     age: "age1" 
 
    }, 
 
    p2: { 
 
     name: "name2", 
 
     age: "age2" 
 
    } 
 
}; 
 

 
function func1(value) { 
 
    console.log('Name:', value); 
 
} 
 

 
function func2(value) { 
 
    console.log('Age:', value); 
 
} 
 

 
for(var i in obj) { 
 
    if(typeof obj[i] != 'object') 
 
    continue; 
 
    console.log('\nOutputing:', i); 
 
    func1(obj[i].name); 
 
    func2(obj[i].age); 
 
}

+0

Он работает. Не могли бы вы объяснить, почему «obj [i] .name' not' obj.i.name'? –

+0

Из-за его синтаксиса. – num8er

+1

Когда вы делаете без [], он не может быть как переменная, которая является ключом для выбора. – num8er

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