ссылка на член объекта JS без ключа - PullRequest
1 голос
/ 25 августа 2009

var foo = {"bar": {"blah": 9}};

Есть ли способ получить значение ["blah"] единственного члена foo, если я не знаю, что ключ "bar"?

Могу ли я как-то ссылаться на первый член объекта, не зная его ключа? Я ищу эквивалент foo [0] ["бла"] если бы foo был обычным массивом.

В моем случае я практически не могу перебрать foo, чтобы получить ключ.

Это ясно?

Ответы [ 5 ]

6 голосов
/ 25 августа 2009

Насколько я знаю, с помощью Javascript Object (в буквальном смысле, объект типа `Object) единственный способ сделать это:

for(var i in foo) {
    var value = foo[i].blah;
    break;   
}

Теперь value будет содержать значение первого перечисляемого свойства объекта bar в объекте foo. Конечно, вы можете абстрагировать это в функцию. Я собирался написать пример, но у CMS есть фантастический пример в своем ответе здесь.

2 голосов
/ 25 августа 2009

Редактировать: Согласитесь с @kangax, гораздо безопаснее создать нормальную функцию, не загрязняя собственный Object.prototype, что может привести к непредвиденному поведению:

function firstMember (obj) {
  for(var i in obj) 
      if (obj.hasOwnProperty(i)){ // exclude properties from the prototype
          return obj[i];
      }
}


firstMember(foo)['blah']; // 9
1 голос
/ 25 августа 2009

Объекты в Javascript - это неупорядоченная коллекция пар имя / значение, поэтому на самом деле нет такой вещи, как доступ к первому или последнему свойству объекта. Единственный способ найти значение определенного ключа - перебрать объект (с помощью for-in). Вы можете остановиться на первой итерации, но порядок не указан, поэтому две разные реализации могут вернуть два разных ключа на первой итерации.

0 голосов
/ 25 августа 2009

Просто посмотрите здесь:

http://dean.edwards.name/weblog/2006/07/enum/

как они перебирают объект, не зная его структуры.

0 голосов
/ 25 августа 2009

Боюсь, то, что вы пытаетесь сделать, просто невозможно. Объекты по сути являются хеш-картами, поэтому порядок, в котором хранятся свойства, должен отображаться в произвольном месте в памяти объекта (и чем лучше хеш-функция, тем больше случайных мест).

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

Возможно, вы могли бы хранить значения как в объекте, так и в массиве?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...