2012-04-26 4 views
49

Как получить ключевое имя для последующего? Например, я хочу «button1» и «button2»?Javascript получить ключевое имя объекта

var buttons = { 
    button1: { 
     text: 'Close', 
     onclick: function(){ 

     } 
    }, 
    button2: { 
     text: 'Close2', 
     onclick: function(){ 

     } 
    } 
} 

var i; 
for(i in buttons){ 
    if(buttons.hasOwnProperty(i)){ 
     alert(buttons[i].text); 
    } 
} 

Я попытался с помощью .push() хотя это не сработало.

+5

Если ваши ключевые имена являются на самом деле 'button1',' button2' и так далее, вы можете захотеть сделать 'buttons' массив – Zirak

ответ

61

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

var buttons = { 
    foo: 'bar', 
    fiz: 'buz' 
}; 

for (property in buttons) { 
    console.log(property); // Outputs: foo, fiz or fiz, foo 
} 

Отметим здесь, что вы итерация свойств объекта, используя property в качестве ссылки на каждый в течение каждого последующего цикла ,

MSDN говорит for (variable in [object | array ]) следующее:

Перед каждой итерации цикла, переменная присваивается следующее имя свойства объекта или следующего индекса элемента массива. Затем вы можете использовать его в любом из операторов внутри цикла для ссылки на свойство объекта или элемент массива.

Следует также отметить, что порядок свойств объекта не является постоянным и может меняться в отличие от индексного порядка массива. Это может пригодиться.

+0

как бы вы получите Foo? – Demodave

+0

@Demodave Чтобы получить значение свойства * foo *, вы просто вызываете его из объекта 'buttons':' buttons.foo === buttons ['foo'] '. Из цикла for вы вызовите 'buttons [property]'. Сегодня вы также можете использовать 'Array.entries ({foo:" bar ", fizz:" buzz "})' для вывода '[['foo': 'bar'], ['fizz', 'buzz']]' , – Sampson

34

ECMAscript edition 5 также предлагает вам опрятные методы Object.keys() и Object.getOwnPropertyNames().

Так

Object.keys(buttons); // ['button1', 'button2']; 
4

Если предположить, что у вас есть доступ к Prototype, это может работать. Я написал этот код для себя всего несколько минут назад; Мне нужен только один ключ за раз, так что это не время для больших списков пар ключ: значение или для выплескивания нескольких ключевых имен.

function key(int) { 
    var j = -1; 
    for(var i in this) { 
     j++; 
     if(j==int) { 
      return i; 
     } else { 
      continue; 
     } 
    } 
} 
Object.prototype.key = key; 

Это пронумеровано, чтобы работать так же, как массивы, чтобы сохранить головные боли. В случае кода:

buttons.key(0) // Should result in "button1"