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



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



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


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



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


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



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



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

584   7  

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. Н. Б.: The 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

старые версии JavaScript (for..in петли:

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

в ES5 вводит

for(var property in data) {
    alert(property);
}

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

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

    return A.join(', ');
}
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]);
}
var fs   = require("fs");

fs.stat( process.argv[1], function( err, stats ){
if (err) {
     console.log( err.message ); 
     return;    
} else {
 console.log(JSON.stringify(stats));

/*  this is the answer here  */

    for (var key in Object.keys(stats)){
    var t = Object.keys( stats )[key];
    console.log( t + " value =: " + stats[t]  );
     }  

/*  to here, run in node */
   }
});
var attr, object_information='';

for(attr in object){

      //Get names and values of propertys with style (name : value)
      object_information += attr + ' : ' + object[attr] + '\n'; 

   }


alert(object_information); //Show all Object

Comments

    Ничего не найдено.