Как мне получить доступ к свойствам объекта javascript, если я не знаю имен?
Скажем, у вас есть объект javascript, например:
var data = { foo: 'bar', baz: 'quux' };
Вы можете получить доступ к свойствам по имени свойства:
var foo = data.foo;
var baz = data["baz"];
Но можно ли получить эти значения, если вы не знаете названия свойств? Неупорядоченность этих свойств делает невозможным рассказать им обособленно?
В моем случае я думаю конкретно о ситуации, когда функция должна принимать серию пар имя-значение, но имена свойств могут измениться.
Мои мысли о том, как это сделать до сих пор, - передать имена свойств функции вместе с данными, но это похоже на взлома. Я бы предпочел сделать это с помощью интроспекции, если это возможно.
Ответы
Ответ 1
В старых версиях 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']]
Ответ 2
Вы можете прокручивать такие клавиши:
for (var key in data) {
console.log(key);
}
В этом журнале "Имя" и "Значение".
Если у вас более сложный тип объекта (а не только простой хэш-подобный объект, как в исходном вопросе), вам нужно будет только прокручивать ключи, принадлежащие самому объекту, в отличие от ключей на object прототип:
for (var key in data) {
if (data.hasOwnProperty(key)) {
console.log(key);
}
}
Как вы отметили, ключи не гарантируются в каком-либо конкретном порядке. Обратите внимание, что это отличается от следующего:
for each (var value in data) {
console.log(value);
}
Этот пример перебирает значения, поэтому он будет записывать Property Name
и 0
. N.B.: Синтаксис 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
Ответ 3
for(var property in data) {
alert(property);
}
Ответ 4
Вы часто захотите изучить свойства конкретных экземпляра объекта,
без использования общих методов и свойств прототипа:
Obj.prototype.toString= function(){
var A= [];
for(var p in this){
if(this.hasOwnProperty(p)){
A[A.length]= p+'='+this[p];
}
}
return A.join(', ');
}
Ответ 5
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]);
}
Ответ 6
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 */
}
});
Ответ 7
var obj = {
a: [1, 3, 4],
b: 2,
c: ['hi', 'there']
}
for(let r in obj){ //for in loop iterates all properties in an object
console.log(r) ; //print all properties in sequence
console.log(obj[r]);//print all properties values
}
Ответ 8
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