返回

高效筛选JavaScript对象属性:多种方法详解

javascript

JavaScript 对象属性筛选

处理 JavaScript 对象时,有时需要仅保留特定的属性,而删除其余属性。 这是一种常见需求,当需要清理数据、只传递特定字段给 API,或是在应用不同层之间转换数据时都会用到。 本文将探讨几种实现此目的的方法,重点介绍它们的原理和用法。

使用 Object.keys()forEach() 循环

这种方法利用 Object.keys() 获取对象的所有键,然后通过 forEach() 遍历这些键。 在循环内部,检查当前键是否存在于期望保留的属性列表中。 如果不存在,则使用 delete 运算符删除此键。

function filterProperties(obj, allowedKeys) {
  Object.keys(obj).forEach(key => {
    if (!allowedKeys.includes(key)) {
      delete obj[key];
    }
  });
}


// 示例
let myObj = {
    p1:123,
    p2:321,
    p3:{p3_1:1231,p3_2:342},
    p4:'23423',
    p99:{p99_1:'sadf',p99_2:234},
    p100:3434
};

let allowedProperties = ['p1', 'p2', 'p100'];
filterProperties(myObj, allowedProperties);

console.log(myObj); // 输出: { p1: 123, p2: 321, p100: 3434 }

步骤:

  1. 定义一个 filterProperties 函数,接受要操作的对象和包含允许属性的数组。
  2. 使用 Object.keys(obj) 获取对象的键数组。
  3. 通过 forEach 迭代键数组。
  4. 对于每个键,使用 allowedKeys.includes(key) 检查其是否被允许。
  5. 如果键不在允许列表中,则使用 delete obj[key] 删除此属性。

这个方法的优势是简单直观,直接修改原对象。

使用 for...in 循环 和 hasOwnProperty()

for...in 循环用于迭代对象的可枚举属性。 配合 hasOwnProperty(),可以只考虑对象自身的属性,排除从原型链继承的属性。 在此循环中,依然可以检查属性是否在允许的列表中,并进行删除操作。

function filterPropertiesUsingForIn(obj, allowedKeys) {
  for (const key in obj) {
      if (obj.hasOwnProperty(key) && !allowedKeys.includes(key)) {
        delete obj[key];
      }
    }
}


// 示例
let myObj2 = {
  p1:123,
  p2:321,
  p3:{p3_1:1231,p3_2:342},
  p4:'23423',
  p99:{p99_1:'sadf',p99_2:234},
  p100:3434
};
let allowedProperties2 = ['p1', 'p2', 'p100'];
filterPropertiesUsingForIn(myObj2, allowedProperties2)
console.log(myObj2); // 输出: { p1: 123, p2: 321, p100: 3434 }

步骤:

  1. 创建一个函数 filterPropertiesUsingForIn,接受一个对象和允许属性的数组。
  2. 使用 for...in 循环遍历对象的所有可枚举属性。
  3. 使用 obj.hasOwnProperty(key) 确保只操作对象自身的属性。
  4. 判断当前键是否不在允许的列表中。 如果是, 使用 delete obj[key] 删除该属性。

使用 for...in 配合 hasOwnProperty 的好处是可以防止意外地修改继承的属性。

注意事项与安全性建议

以上两种方法直接修改原对象。 在某些情况下,这可能是不期望的。 如果需要保留原始对象,则可以先复制一份,然后操作复制的对象, 使用浅拷贝或深拷贝来保证不会互相影响。

在筛选属性时,应该格外注意输入的数据来源, 尤其是如果数据来自于外部(例如用户的输入,或API请求的返回数据)。 避免使用用户的输入直接生成 allowedKeys , 防止意外操作,以及不必要的数据暴露。 应当进行验证或者类型检查以防止代码出错。

本文提供的几种方案能帮助开发者根据实际需求高效地筛选 JavaScript 对象属性。理解它们的实现原理,有助于选择最佳方案。在开发过程中始终牢记安全实践,并合理使用复制等技巧,可以更健壮地处理对象数据。