2009-02-25 2 views
89

Есть ли способ перебрать все свойства объекта с использованием рамки прототипа JavaScript?Итерация над каждым свойством объекта в javascript с использованием прототипа?

Вот ситуация: я получаю ответ AJAX в JSON, который выглядит примерно так:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}} 

Если я оцениваю, что ответ JSON в к переменной response, я хочу, чтобы иметь возможность перебирать каждый свойство в объекте response.barobj, чтобы увидеть, какие индексы истинны и которые являются ложными.

Прототип имеет как Object.keys(), так и Object.values(), но, как ни странно, у него нет простой функции Object.each()! Я мог бы взять результаты Object.keys() и Object.values ​​() и перекрестно ссылаться на другой, поскольку я перебираю один, но это такой хак, что я уверен, что есть правильный способ сделать это!

ответ

42

Вы должны сначала convert your object literal to a Prototype Hash:

// Store your object literal 
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}} 

// Iterate like so. The $H() construct creates a prototype-extended Hash. 
$H(obj).each(function(pair){ 
    alert(pair.key); 
    alert(pair.value); 
}); 
+0

Отлично! Это именно то, что я искал. – OverloadUT

+57

К сожалению, поскольку аналогичный вопрос был закрыт, тот, который просто хотел перебирать простой объект javascript без Prototype, теперь я должен рассматривать этот ответ так, как если бы он был таким же, как вопрос, который был закрыт из-за «дублирования». Итак, ужасный пример, поскольку он заставляет пользователя загружать Prototype. Пользователь ничего не сказал о Prototype, поэтому заставить их загружать нежелательную библиотеку не полезно. (помните, рассматривая это, как если бы это был действительно дубликат). Если другой вопрос не был закрыт из-за ложного утверждения о дублировании, мне не пришлось бы проголосовать за ответ. – 2010-02-12 21:05:34

+2

Не спрашивал ли заявитель, что им нужен Prototype (или был отредактирован вопрос?)? В любом случае это все хорошо – emurano

0

Вы должны перебирать ключи и получать значения с помощью квадратных скобок.

См: How do I enumerate the properties of a javascript object?

EDIT: Очевидно, что это делает вопрос дубликат.

+0

Этот метод сильно обескураженный против в прототипе документы: http://www.prototypejs.org/api/array – OverloadUT

+1

Кроме того, я не думаю, что это дубликат, потому что я искал собственное прототипное решение, которое я получил. Другой вопрос подходит для тех, кто не хочет, чтобы он использовал фреймворк, но это решение намного безопаснее, если вы используете Prototype. – OverloadUT

+1

@OverloadUT: вы не читали достаточно внимательно: не рекомендуется перебирать свойства массивов, а не простых объектов. – Christoph

546

Там нет необходимости для прототипа здесь: JavaScript имеет for..in петли. Если вы не уверены, что ни один перепутались с Object.prototype, проверьте hasOwnProperty(), а также, то есть

for(var prop in obj) { 
    if(obj.hasOwnProperty(prop)) 
     doSomethingWith(obj[prop]); 
} 
+139

Благодарим вас за фактический ответ, не заставляя нас загружать нежелательную библиотеку. – 2010-02-12 21:06:53

+8

Это не правильный ответ. в вопросах указывается, что прототип должен использоваться! свобода выбора - хаха ... –

+11

+1 Это правильный ответ на название вопроса. –

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