Как получить доступ к свойствам объекта javascript, если я не знаю имен?
скажем, у вас есть объект javascript, как это:
var data = { foo: 'bar', baz: 'quux' };
Вы можете получить доступ к свойствам по имени собственность:
var foo = data.foo;
var baz = data["baz"];
но можно ли получить эти значения, если вы не знаете имя свойств? Неупорядоченность этих свойств делает невозможным их различение?
в моем случае я имею в виду конкретно ситуацию, когда функция должна принимать ряд пар имя-значение, но имена свойств может изменить.
мои мысли о том, как это сделать до сих пор, чтобы передать имена свойств функции вместе с данными, но это похоже на взлом. Я бы предпочел сделать это с помощью самоанализа, если это возможно.
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. Н. Б.: Thefor 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 вводит
вы часто захотите изучить особенности свойства экземпляра объекта, без всех его общих методов прототипа и свойств:
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