Итерации по каждому свойству объекта в javascript с помощью Prototype?


89

Есть ли способ перебрать каждое свойство объекта с помощью инфраструктуры Prototype JavaScript?

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

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

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

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

Ответы:


42

Сначала вам нужно преобразовать литерал вашего объекта в хэш прототипа :

// 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);
});

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

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

2
Разве спрашивающий не упомянул, что им нужен прототип (или вопрос был отредактирован?)? В любом случае, все хорошо
emurano

Нет необходимости загружать внешнюю библиотеку
Healkiss

553

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

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

140
Спасибо за точный ответ, не заставляя нас загружать ненужную библиотеку.

8
это не правильный ответ. в вопросах говорится, что нужно использовать прототип! свобода выбора - ха-ха ...
Свен Ларсон

1
В первоначальном заголовке этого вопроса упоминался прототип, который я добавил для ясности. Этот вопрос, как видно из самой первой строки тела, касался конкретно среды, в которой используется Prototype.
OverloadUT

1
Чем больше вы пишете Javascript, тем больше вы ненавидите писать forциклы :)
Триптих

13
К сожалению, это вопрос, который появляется как №1, если вы ищете в Google что-то вроде «как перебрать все свойства объекта javascript», поэтому многие люди, приходящие сюда, действительно, вероятно, ищут ответ на этот вопрос. Им нужен следующий вопрос: stackoverflow.com/questions/921789/… , который на самом деле не имеет ничего общего с объектными литералами.
Baxissimo 01

0

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

См .: Как мне перечислить свойства объекта javascript?

РЕДАКТИРОВАТЬ: Очевидно, это делает вопрос дубликатом.


Этот метод категорически не рекомендуется использовать в документации по прототипу
OverloadUT

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

1
@OverloadUT: вы недостаточно внимательно прочитали: не рекомендуется перебирать свойства массивов, а не простых объектов
Кристоф,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.