当前位置: 首页 > news >正文

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

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

小白视角:什么是omit?

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

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

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

初级前端:基本应用场景

1. 表单数据提交

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

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

2. 隐藏敏感信息

const userInfo = omit(userData, ['password', 'idNumber']);

中级前端:更深入的理解

1. 自己实现一个omit

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. 性能考量

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

// 方式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的好处是支持树摇,只会打包你使用的函数:

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

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

3. 高性能场景中的取舍

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

// 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类型安全版本

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不仅是一个工具函数,更体现了函数式编程中数据不可变性的思想,以及前端开发中数据转换和适配的核心理念。

相关文章:

  • Solidity智能合约漏洞类型与解题思路指南
  • 用Python 还是C\C++ 开发嵌入式物联网项目
  • 使用Python快速删除Docker容器、镜像和存储内容
  • oracle 游标的管理
  • ubuntu安装docker和docker-compose【简单详细版】
  • Git工作流、命令汇总
  • 【GEE学习笔记】报错解决:Sentinel-2 数据集分为 L1C(大气顶层)和 L2A(地表反射率),如何选择波段进行去云处理?
  • 图论:单源最短路(BF算法+迪杰斯特拉算法+spfa算法)
  • 制定大运维管理体系的标准、流程、机制、规范
  • SolidWorks2025三维计算机辅助设计(3D CAD)软件超详细图文安装教程(2025最新版保姆级教程)
  • Tiktok 关键字 视频及评论信息爬虫(2) [2025.04.07]
  • 【Vue】选项卡案例——NBA新闻
  • 大数据笔试题_第一阶段配套笔试题03
  • 滑动窗口思想 面试算法高频题
  • 双引擎驱动:智能知识库 + AI 陪练重构售后服务管理体系
  • 【一篇搞定配置】一篇带你从配置到使用(PyCharm远程)完成服务器运行项目(配置、使用一条龙)【全网最详细版】
  • 算法-尼姆博弈
  • 【【分享开发笔记,赚取电动螺丝刀】参考 RT-thread 的方式管理初始化函数调用】
  • 【Linux】iptables防火墙基本概念
  • 数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记2
  • 七猫征文大赛颁出112万奖金,非遗题材作品斩获金奖
  • 商务部:中方敦促美方尽快停止232关税措施
  • 押井守在30年前创造的虚拟世界何以比当下更超前?
  • 陕西旱情实探:大型灌区农业供水有保障,大旱之年无旱象
  • 4月企业新发放贷款利率处于历史低位
  • 央媒评网红质疑胖东来玉石定价暴利:对碰瓷式维权不能姑息