function enumerateProperties(obj) {
const properties = [];
for (const key in obj) {
if (obj.hasOwnProperty(key)) { // 过滤掉继承的属性
properties.push({
name: key,
value: obj[key]
});
}
}
return properties;
}
// 使用示例:
const myObject = {
name: "John Doe",
age: 30,
city: "New York",
greet: function() {
console.log("Hello!");
}
};
const properties = enumerateProperties(myObject);
// 打印属性名和值
for (const property of properties) {
console.log(`${property.name}: ${property.value}`);
}
// 或转换成其他格式,例如表格:
console.table(properties);
// 更简洁的写法,使用Object.entries() (ES2017+)
function enumeratePropertiesES2017(obj) {
return Object.entries(obj).map(([key, value]) => {
return { name: key, value: value };
});
}
const propertiesES2017 = enumeratePropertiesES2017(myObject);
console.table(propertiesES2017);
// 如果只需要属性名,可以使用 Object.keys()
const propertyNames = Object.keys(myObject);
console.log(propertyNames); // 输出: ['name', 'age', 'city', 'greet']
// 如果只需要属性值,可以使用 Object.values() (ES2017+)
const propertyValues = Object.values(myObject);
console.log(propertyValues); // 输出: ['John Doe', 30, 'New York', ƒ]
// Reflect.ownKeys() 可以获取所有自身属性,包括 Symbol 属性 (ES2015+)
const allOwnKeys = Reflect.ownKeys(myObject);
console.log(allOwnKeys); // 输出: ['name', 'age', 'city', 'greet'] (如果对象有Symbol属性,也会包含在内)
方法解释:
-
enumerateProperties(obj)
:- 使用
for...in
循环遍历对象的所有可枚举属性。 - 使用
hasOwnProperty(key)
方法检查属性是否为对象自身属性,而不是继承自原型链的属性。 这很重要,可以避免遍历到不期望的属性。 - 将属性名和值存储在一个数组中,每个元素是一个包含
name
和value
属性的对象。
- 使用
-
enumeratePropertiesES2017(obj)
:- 使用
Object.entries()
获取一个包含键值对的数组。 - 使用
map()
方法将键值对数组转换为包含name
和value
属性的对象数组。 这种方法更简洁。
- 使用
-
Object.keys(obj)
: 直接返回一个包含所有自身可枚举属性名的数组。 -
Object.values(obj)
: 直接返回一个包含所有自身可枚举属性值的数组。 -
Reflect.ownKeys(obj)
: 返回一个包含所有自身属性的数组,包括 Symbol 属性和不可枚举属性。
选择哪种方法取决于你的需求:
- 想要所有自身属性的名称和值,使用
enumerateProperties
或enumeratePropertiesES2017
。 - 只需要属性名,使用
Object.keys
。 - 只需要属性值,使用
Object.values
。 - 需要所有自身属性,包括 Symbol,使用
Reflect.ownKeys
。
这个例子提供了多种遍历对象属性的方法,并解释了每种方法的用途和区别,希望能帮助你更好地理解和使用它们。 选择哪种方法取决于你的具体需求。
标签:遍历,const,name,Object,指定,key,obj,属性 From: https://www.cnblogs.com/ai888/p/18591723