【lodash的omit函数详解 - 从入门到精通】

lodash的omit函数详解 - 从入门到精通

小白视角:什么是omit?

omit在英文中意为"忽略"或"省略"。在编程中,它就是从一个对象中删除不需要的属性,返回一个新对象。

js 复制代码
// 原始对象
const person = {name: "张三", age: 30, password: "123456"};

// 使用omit删除password
const safeInfo = omit(person, ['password']);
// 结果: {name: "张三", age: 30}

初级前端:基本应用场景

1. 表单数据提交

就像当前代码中的用法,提交前去除不需要传给后端的字段:

js 复制代码
const params = {
  ...omit(formData.value, [
    'password2',  // 确认密码字段不需要提交
    'checkAgreement',  // 只用于前端验证
    // 其他不需要的字段
  ]),
  password,  // 加密后的密码
  secretToken  // 额外添加的字段
};

2. 隐藏敏感信息

js 复制代码
const userInfo = omit(userData, ['password', 'idNumber']);

中级前端:更深入的理解

1. 自己实现一个omit

js 复制代码
function myOmit(obj, keysToRemove) {
  // 方法1: 使用解构和过滤
  return Object.fromEntries(
    Object.entries(obj).filter(([key]) => !keysToRemove.includes(key))
  );
  
  // 方法2: 使用reduce
  // return Object.keys(obj).reduce((result, key) => {
  //   if (!keysToRemove.includes(key)) {
  //     result[key] = obj[key];
  //   }
  //   return result;
  // }, {});
}

2. 性能考量

针对项目中的注册表单,分析不同方法的优劣:

js 复制代码
// 方式1:使用omit (当前代码使用)
const params = {
  ...omit(formData.value, ['password2', 'checkAgreement', /* 其他字段 */]),
  password,
  secretToken
};

// 方式2:手动解构
const { password2, checkAgreement, smsCode, ...rest } = formData.value;
const params = {
  ...rest,
  password,
  secretToken
};

// 方式3:手动构造
const params = {
  operatorName: formData.value.operatorName,
  operatorId: formData.value.operatorId,
  // ... 列出所有需要的字段
  password,
  secretToken
};

方式1代码最清晰,方式2在字段少时效率最高,方式3最繁琐但最明确。

高级前端:深入源码与最佳实践

1. lodash-es的omit源码精髓

lodash的omit实际上是先通过baseClone创建一个浅拷贝,然后利用内部的basePick函数实现。它处理了大量边界情况,比如属性描述符、Symbol键、原型链等。

2. 树摇优化考量

使用lodash-es而非lodash的好处是支持树摇,只会打包你使用的函数:

js 复制代码
// 推荐: 只引入需要的函数
import { omit } from 'lodash-es';

// 不推荐: 引入全部
import _ from 'lodash';

3. 高性能场景中的取舍

当处理大型对象或频繁操作时,考虑这些替代方案:

js 复制代码
// 1. 使用Object.create保留原型链
function fastOmit(obj, keys) {
  const result = Object.create(Object.getPrototypeOf(obj));
  for (const key in obj) {
    if (!keys.includes(key) && Object.prototype.hasOwnProperty.call(obj, key)) {
      result[key] = obj[key];
    }
  }
  return result;
}

// 2. 使用Map/Set优化查找
function optimizedOmit(obj, keys) {
  const keysSet = new Set(keys);
  return Object.fromEntries(
    Object.entries(obj).filter(([key]) => !keysSet.has(key))
  );
}

4. TypeScript类型安全版本

ts 复制代码
function omit<T extends object, K extends keyof T>(
  obj: T, 
  keys: K[]
): Omit<T, K> {
  const result = { ...obj };
  keys.forEach(key => delete result[key]);
  return result;
}

通过对表单处理这个场景深入思考,omit不仅是一个工具函数,更体现了函数式编程中数据不可变性的思想,以及前端开发中数据转换和适配的核心理念。

相关推荐
你挚爱的强哥14 分钟前
【pdf】自定义组件:预览指定地址的PDF文件
开发语言·前端·javascript
linux-hzh1 小时前
day07
前端·javascript·css
新中地GIS开发老师1 小时前
新中地三维GIS开发智慧城市效果和应用场景
javascript·arcgis·智慧城市·gis开发·webgis·地理信息科学
Mintopia1 小时前
当像素跳起光影圆舞曲:用 JavaScript 解锁实时全局光照的魔法
前端·javascript·计算机图形学
温正实1 小时前
spring boot 实现接入 deepseek gpt接口 流式输出
javascript·spring boot·gpt
李q华1 小时前
react与vue的渲染原理
javascript·vue.js·react.js
爱看书的小沐1 小时前
【小沐杂货铺】基于Three.JS绘制太阳系Solar System(GIS 、WebGL、vue、react,提供全部源代码)第2期
javascript·vue.js·gis·webgl·three.js·地球·earth
前端设计诗2 小时前
Cursor Figma MCP 完整使用教程
前端·javascript·cursor
架构个驾驾2 小时前
Mixin 深度解析与实战指南
前端·javascript·vue.js