Подтвердить что ты не робот

JavaScript - Получение имени элемента в ассоциативном массиве

У меня есть объект JavaScript, который рассматривается как ассоциативный массив. Позвольте называть его "полями". Он имеет несколько элементов, например:

fields['element1'] = ...
fields['element2'] = ...
fields['element3'] = ...

Если заданы поля [0], возможно ли получить имя свойства (которое является "element1" ) вместо его значения?

4b9b3361

Ответ 1

Скажем, у вас есть объект oObject. Это может быть:

var oObject = {} ;
oObject["aaa"] = "AAA" ;
oObject["bbb"] = "BBB" ;
oObject["ccc"] = "CCC" ;
oObject["ddd"] = "DDD" ;
oObject["eee"] = "EEE" ;

Теперь скажем, что вы хотите узнать его имена и значения свойств, чтобы поместить в переменную strName и strValue. Для этого вы используете конструкцию "for (x in o)", как в следующем примере:

var strName, strValue ;

for(strName in oObject)
{
   strValue = oObject[strName] ;
   alert("name : " + strName + " : value : " + strValue) ;
}

Конструкция "for (x in o)" будет перебирать все свойства объекта "o" и на каждой итерации помещает в переменную "x" текущее имя свойства. Все, что вам нужно сделать, чтобы иметь свою ценность, - это написать o [x], но вы уже это знали.

Дополнительная информация

После некоторого размышления, и, увидев комментарий Хэнк Гей, я чувствую, что дополнительная информация может быть интересной.

Пусть будет наивным (и забыть "в JavaScript, все объекты, включая массивы, являются ассоциативными контейнерами" ).

Обычно вам нужны два типа контейнеров: Карты и массивы.

Карты создаются, как в моем примере выше (с использованием "o = new Object();" или "o = {};" нотации, и к ним необходимо получить доступ через свои свойства. Конечно, карты являются картами, нет заказ гарантирован.

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

Точка:

  • Если вам нужна карта, используйте контейнер "new Object()"
  • Если вам нужен массив, une массив, используйте контейнер "new Array()"
  • НЕ СОХРАНИТЕСЬ, смешивая эти два и НЕ КОГДА-ЛИБО доступ к карте через индексы и для массивов, ВСЕГДА обращайтесь к своим данным через свои индексы, потому что, если вы не следуете этим принципам, вы не получите то, что вы хотите.

Ответ 2

Нет, по двум причинам.

  • поля [0] и поля [ "element1" ] - это разные свойства.
  • свойства в объекте явно неупорядочены

Вы можете перебрать свойства:

function (obj) {
  for (prop in obj) {
    if (obj.hasOwnProperty(prop) {
      return prop;
    }
  }
};

... получить свойство "first" для некоторого произвольного значения "first", которое может измениться в любое время.

http://ajaxian.com/archives/fun-with-browsers-for-in-loop объясняет шаблон hasOwnProperty.

Ответ 3

Нет fields[0] (если fields не является объектом Array, который поддерживает числовые индексы), поэтому вы не можете получить его имя именно так. Но вы можете имитировать это следующим образом:

function getKey(obj, i) {
    var j = 0;
    for (var p in obj) {
        if (j++ == i) return p;
    }
    return null;
}

for (var p in obj) будет проходить через каждое имя поля в объекте obj. Получив имя n-го поля, вы можете эффективно получить "ключ" для определенного индекса.

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

Ответ 4

Просто чтобы указать, что подразумевается в каждом другом, ответьте: "ассоциативные массивы" в Javascript на самом деле являются просто экземплярами Object, например,

var aa = {};
aa.foo = 'argle';
alert(aa['foo']); // Will alert 'argle'

ПОЖАЛУЙСТА, не используйте Array вместо Object -it, который может вызвать хаос на итерации for key in aa.