Как мне получить доступ к свойствам объекта javascript, если я не знаю имен?

Скажем, у вас есть такой объект javascript:

var data = { foo: 'bar', baz: 'quux' };

Вы можете получить доступ к свойствам по имени свойства:

var foo = data.foo;
var baz = data["baz"];

Но можно ли получить эти значения, если вы не знаете названия свойств? Делает ли неупорядоченный характер этих свойств невозможным их различение?

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

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


person Adam Lassek    schedule 23.03.2009    source источник


Ответы (7)


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

for (var key in data) {
  console.log(key);
}

Это регистрирует «Имя» и «Значение».

Если у вас есть более сложный тип объекта (а не просто объект, похожий на хэш, как в исходном вопросе), вам нужно будет перебирать только ключи, принадлежащие самому объекту, а не ключи на объекте прототип:

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    console.log(key);
  }
}

Как вы заметили, ключи не обязательно находятся в каком-либо конкретном порядке. Обратите внимание, чем это отличается от следующего:

for each (var value in data) {
  console.log(value);
}

В этом примере циклически перебираются значения, поэтому в журнал будут записываться Property Name и 0. NB: синтаксис for each в основном поддерживается только в Firefox, но не в других браузерах.

Если ваши целевые браузеры поддерживают ES5 или ваш сайт содержит es5-shim.js (рекомендуется), вы также можете используйте Object.keys:

var data = { Name: 'Property Name', Value: '0' };
console.log(Object.keys(data)); // => ["Name", "Value"]

и выполните цикл с Array.prototype.forEach:

Object.keys(data).forEach(function (key) {
  console.log(data[key]);
});
// => Logs "Property Name", 0
person Ron DeVera    schedule 23.03.2009
comment
Ты только что выдумал последнюю и тебе это сошло с рук? Молодец... =) - person nickl-; 25.09.2012
comment
Это существует в Firefox (документы ), но справедливо отметить, что это не универсально. Я обновлю ответ, чтобы упомянуть об этом. - person Ron DeVera; 26.09.2012
comment
Кстати, оповещение - плохой способ отладки, попробуйте console.log - person StackOverflowed; 21.10.2012
comment
Это был лучший ответ, когда был задан вопрос, но я снимаю галочку, потому что более поздние версии JS предоставили лучшие инструменты. - person Adam Lassek; 26.04.2017

Старые версии JavaScript (‹ ES5) требуют использования цикла for..in:

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    // do something with key
  }
}

В ES5 представлены Object.keys и Array#forEach, что немного упрощает задачу:

var data = { foo: 'bar', baz: 'quux' };

Object.keys(data); // ['foo', 'baz']
Object.keys(data).map(function(key){ return data[key] }) // ['bar', 'quux']
Object.keys(data).forEach(function (key) {
  // do something with data[key]
});

ES2017 представляет Object.values и Object.entries.

Object.values(data) // ['bar', 'quux']
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]
person Adam Lassek    schedule 20.04.2012
comment
Теперь это на самом деле отвечает на вопрос, молодец @Adam Lassek, очень хорошо сделано. - person nickl-; 25.09.2012
comment
Ошибочно использовать как «имя», так и «значение» в качестве ключей объекта. Эта функция возвращает только ключи в списке, а не значения. { name1: 'value1', name2: 'value2' } позволит избежать путаницы у новичков. Объект.ключи(данные); // ['имя1', 'имя2'] - person James Nicholson; 15.03.2017
comment
@JamesNicholson Я согласен, отредактировано, чтобы быть менее запутанным. - person Adam Lassek; 26.04.2017

Часто вам потребуется изучить конкретные свойства экземпляра объекта без всех его общих методов и свойств прототипа:

 Obj.prototype.toString= function(){
        var A= [];
        for(var p in this){
            if(this.hasOwnProperty(p)){
                A[A.length]= p+'='+this[p];
            }
        }

    return A.join(', ');
}
person kennebec    schedule 24.03.2009

function getDetailedObject(inputObject) {
    var detailedObject = {}, properties;

    do {
        properties = Object.getOwnPropertyNames( inputObject );
        for (var o in properties) {
            detailedObject[properties[o]] = inputObject[properties[o]];
        }
    } while ( inputObject = Object.getPrototypeOf( inputObject ) );

    return detailedObject;
}

Это позволит получить все свойства и их значения (унаследованные или собственные, перечисляемые или нет) в новом объекте. исходный объект остается нетронутым. Теперь новый объект можно обойти с помощью

var obj = { 'b': '4' }; //example object
var detailedObject = getDetailedObject(obj);
for(var o in detailedObject) {
    console.log('key: ' + o + '   value: ' + detailedObject[o]);
}
person Shishir Arora    schedule 22.04.2015

Вы можете использовать Object.keys(), «который возвращает массив имен собственных перечислимых свойств данного объекта в том же порядке, что и в обычном цикле».

Вы можете использовать любой объект вместо stats:

var stats = {
  a: 3,
  b: 6,
  d: 7,
  erijgolekngo: 35
}
/*  this is the answer here  */
for (var key in Object.keys(stats)) {
  var t = Object.keys(stats)[key];
  console.log(t + " value =: " + stats[t]);
}

person Cloid J. Green    schedule 12.03.2013
comment
Не могли бы вы добавить больше пояснений? - person Keith Pinson; 13.03.2013
comment
Object.keys( stats )[key] не имеет смысла, всегда будет undefined. - person Adam Lassek; 21.05.2015

person    schedule
comment
где этот ответ предоставляет то, что требуется OP, но небольшое описание того, что вы делаете, и почему OP должен его использовать, было бы неплохо, также не забывайте .hasOwnProperty() при использовании for in для итерации объекта. - person Muhammad Omer Aslam; 24.01.2019
comment
Спасибо, я согласен с тем, что .hasOwnProperty() повторяет объект, но выполняет итерацию для проверки условия, однако, используя его, мы не можем распечатать все свойства объекта. Поправьте меня, если я ошибаюсь. - person Mayank_VK; 24.01.2019
comment
Метод hasOwnProperty() возвращает boolean, указывающее, имеет ли объект указанное свойство как собственное свойство (в отличие от его наследования). см. этот пример - person Muhammad Omer Aslam; 24.01.2019

person    schedule
comment
Это ничего не добавляет к принятому ответу и представляет информацию наименее полезным способом. И это не учитывает унаследованные свойства. - person Adam Lassek; 16.04.2013