【问题标题】:Accessing object properties inside array through object method通过对象方法访问数组内部的对象属性
【发布时间】:2019-01-06 14:01:41
【问题描述】:

这可能是一个简单的解决方案,但我不知道是否可以使用此方法。这个问题之前以不同的方式被问过,但我正在查看对象方法而不是函数,所以请耐心等待。

这是否可以通过Object.getOwnPropertyNames(object)访问对象属性并将它们作为数组返回?

例如,此方法适用于没有数组的以下变量。

var y = {
  firstName: "John",
  lastName: "Doe",
  eyeColor: "Black",
  age: 50
};
console.log(
  Object.getOwnPropertyNames(y)
);
Returns 
(4) ["firstName", "lastName", "eyeColor", "age"]

我们可以使用相同的方法来访问数组中的对象属性吗?

var x = [{
  firstName: "John",
  lastName: "Doe",
  eyeColor: "Black",
  age: 50
}, {
  firstName: "Marry",
  lastName: "Smith",
  eyeColor: "Brown",
  age: 45
}];

【问题讨论】:

  • 数组中的所有对象是否都具有相同的结构?也是所有属性都是强制性的吗?这很重要,有些答案会在没有先问的情况下对这个问题的答案做出假设。

标签: javascript arrays object


【解决方案1】:

您可以为此使用spread operator ...

var x = [{
  firstName: "John",
  lastName: "Doe",
  eyeColor: "Black",
  age: 50
}, {
  firstName: "Marry",
  lastName: "Smith",
  eyeColor: "Brown",
  age: 45
}];

console.log(
  Object.getOwnPropertyNames(...x)
);  

【讨论】:

  • 你为什么要做解构(顺便说一句,这不是这里使用的,它是扩展语法),只有x[0]就足够了?
【解决方案2】:

这行不通,但根据您想要的输出结构,您可以使用map 来转换每个数组元素

x.map(Object.getOwnPropertyNames)

将返回一个属性名称数组的数组。

【讨论】:

    【解决方案3】:
    var x = [{firstName: "John", lastName : "Doe", eyeColor : "Black", age : 50}, {firstName: "Marry", lastName : "Smith", eyeColor : "Brown", age : 45}];
    
    x.map(y => console.log(Object.getOwnPropertyNames(y)))
    

    您可以使用 map() 访问数组中的对象。

    【讨论】:

      【解决方案4】:
      var propNames = Object.getOwnPropertyNames(x[0]);
      

      x[0] 是数组中的第一个对象,由于所有对象似乎都具有相同的键,因此在第一个对象上调用该函数将得到您想要的结果。

      注意:此解决方案假定数组中至少有一个对象,因此您可能需要在执行x[0] 之前先检查该对象,否则您会收到错误消息。

      示例:

      var x = [{firstName: "John", lastName : "Doe", eyeColor : "Black", age : 50}, {firstName: "Marry", lastName : "Smith", eyeColor : "Brown", age : 45}];
      
      var propNames = Object.getOwnPropertyNames(x[0]);
      
      console.log(propNames);

      【讨论】:

      • 假设数组中至少有一个元素
      • @Damo 是的,但这是 OP 关心的问题。 OP 正在询问如何获取数组内对象的属性名称,无需使事情复杂化。还是添加了注释。
      【解决方案5】:

      如果对象数组包含具有不同属性的对象,您可以获得唯一属性名称的列表:

      var x = [{
        firstName: "John",
        lastName: "Doe",
        eyeColor: "Black"
      }, {
        firstName: "Marry",
        lastName: "Smith",
        age: 45
      }];
      
      var arrayOfArrays = x.filter(obj => obj).map(Object.getOwnPropertyNames)
      var array = [].concat.apply([], arrayOfArrays);
      var uniqueProperties = [...new Set(array)]
      
      console.log(uniqueProperties);

      如果数组为空,或者数组包含 null 或 undefined,这不会崩溃。但它确实假设 x 是一个数组,无论是否为空。

      【讨论】:

        猜你喜欢
        • 2013-06-06
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多