Ітерація кожної властивості об’єкта в javascript за допомогою прототипу?


89

Чи існує спосіб перебору кожної властивості об’єкта за допомогою фреймворку прототипу 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

Спочатку потрібно перетворити об’єктний літерал у хеш прототипу :

// 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. Користувач нічого не сказав про прототип, тому змушувати їх завантажувати небажану бібліотеку не корисно. (пам’ятайте, трактуючи це так, ніби це дійсно дублікат). Якби інше питання не було закрито через хибну заяву про дублювання, мені б не довелося голосувати проти відповіді.

2
Хіба запитувач не згадав, що вони хочуть Прототип (чи питання було відредаговано?)? У будь-якому разі все добре
емурано

Не потрібно завантажувати зовнішню бібліотеку
Healkiss

553

Тут немає потреби в прототипі: JavaScript має for..inцикли. Якщо ви не впевнені, що ніхто не заплутався Object.prototype, також перевірте hasOwnProperty(), тобто

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

140
Дякуємо за фактичну відповідь, не змушуючи нас завантажувати небажану бібліотеку.

8
це не правильна відповідь. питання говорить, що прототип повинен бути використаний! свобода вибору - ха-ха ...
Свен Ларсон

1
В оригінальній назві цього запитання згадувався «Прототип», який я додав для пояснення. Це питання, як засвідчує сама перша лінія тіла, конкретно задавало питання про середовище, в якому використовується Прототип.
OverloadUT

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

13
На жаль, це питання висувається на перше місце, якщо ви шукаєте щось на зразок "як переглядати всі властивості об'єкта javascript", тому багато людей, які приходять сюди, справді, напевно, шукають відповіді на це питання. Питання, яке вони хочуть, полягає в цьому: stackoverflow.com/questions/921789/… , який насправді не має нічого спільного з літералами об’єктів.
Baxissimo

0

Вам слід переглядати ключі та отримувати значення за допомогою квадратних дужок.

Див .: Як перерахувати властивості об’єкта javascript?

EDIT: Очевидно, це робить питання дублікатом.


Цьому методу категорично не рекомендується в документах Prototype: prototypejs.org/api/array
OverloadUT

1
Крім того, я не думаю, що це дублікат, тому що я шукав прототипне рішення, яке я отримав. Інше питання пристойне для тих, хто не хоче використовувати фреймворк, але це рішення набагато безпечніше, якщо ви використовуєте Prototype.
OverloadUT

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