【问题标题】:Filter an array of objects according to the name of the key in the objects [duplicate]根据对象中键的名称过滤对象数组[重复]
【发布时间】:2021-11-07 00:26:44
【问题描述】:

我有一个对象数组,我想根据这些对象的键名进行过滤。在这种特殊情况下,我知道数组中的每个元素都会有一个键/值对。

假设一个数组如下所示:

let dataArray = [
  {
    "name": "David" 
  },
  {
    "location": "New York"
  },
  {
    "name": "Jenna"
  }
]

我想要结束的只是一个数组,其中key 是“名称”:

[
  {
    name: "David" 
  },
  {
    name: "Jenna"
  }
]

我已经尝试过使用filter 方法的各种方法,例如:

const namesArr = dataArr.filter(i => i[key] === 'name');

但似乎没有一个能产生正确的结果。

【问题讨论】:

标签: javascript arrays


【解决方案1】:

使用in 运算符检查对象上是否存在属性:

const dataArray = [{"name":"David"},{"location":"New York"},{"name":"Jenna"}];

// name exists on the object
console.log(dataArray.filter(item => 'name' in item));

// or location doesn't exist on the object
console.log(dataArray.filter(item => !('location' in item)));

【讨论】:

    【解决方案2】:

    您可以使用 object.hasOwnProperty('name') 返回一个布尔值,指示对象是否具有属性名称

    let dataArray = [
      {
        "name": "David" 
      },
      {
        "location": "New York"
      },
      {
        "name": "Jenna"
      }
    ]
    
    const filtered = dataArray.filter(x => x.hasOwnProperty('name'));
    
    console.log(filtered);

    另一种选择是使用in 运算符:

    let dataArray = [
      {
        "name": "David" 
      },
      {
        "location": "New York"
      },
      {
        "name": "Jenna"
      }
    ]
    
    const filtered = dataArray.filter(x => 'name' in x);
    
    console.log(filtered);

    【讨论】:

      【解决方案3】:

      您可以使用in 运算符来过滤存在的特定键,请参阅reference。

      dataArr.filter(obj => 'name' in obj)
      

      仅检查obj.name 会排除“名称”字段为false 或null 或undefined 的对象,即使该属性存在于对象上。

      【讨论】:

      • 这个真的很简洁。不错!
      • 是的,请注意,例如'hasOwnProperty' in {} === true
      • 以及其原型链中的所有其他属性
      猜你喜欢
      • 1970-01-01
      • 2017-07-17
      • 2018-05-25
      • 2019-07-22
      • 2016-05-15
      • 2020-12-03
      • 1970-01-01
      • 2021-04-21
      • 2018-12-25
      相关资源
      最近更新 更多