写一个方法遍历指定对象的所有属性

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) 方法检查属性是否为对象自身属性,而不是继承自原型链的属性。 这很重要,可以避免遍历到不期望的属性。
    • 将属性名和值存储在一个数组中,每个元素是一个包含 namevalue 属性的对象。
  • enumeratePropertiesES2017(obj):

    • 使用 Object.entries() 获取一个包含键值对的数组。
    • 使用 map() 方法将键值对数组转换为包含 namevalue 属性的对象数组。 这种方法更简洁。
  • Object.keys(obj): 直接返回一个包含所有自身可枚举属性名的数组。

  • Object.values(obj): 直接返回一个包含所有自身可枚举属性值的数组。

  • Reflect.ownKeys(obj): 返回一个包含所有自身属性的数组,包括 Symbol 属性和不可枚举属性。

选择哪种方法取决于你的需求:

  • 想要所有自身属性的名称和值,使用 enumeratePropertiesenumeratePropertiesES2017
  • 只需要属性名,使用 Object.keys
  • 只需要属性值,使用 Object.values
  • 需要所有自身属性,包括 Symbol,使用 Reflect.ownKeys

这个例子提供了多种遍历对象属性的方法,并解释了每种方法的用途和区别,希望能帮助你更好地理解和使用它们。 选择哪种方法取决于你的具体需求。

posted @ 2024-12-07 09:03  王铁柱6  阅读(52)  评论(0)    收藏  举报