你可能不需要 Lodash

2025-06-08

你可能不需要 Lodash

您可以在我的主博客上查看更多教程和文章。享受这篇文章!

虽然 Lodash 可能已经成为任何 JavaScript 开发人员工具包中的主要内容,但其中的许多方法已经慢慢迁移成为 JavaScript 本身的一部分,或者更确切地说是 EcmaScript 规范的一部分。

Lodash 并不庞大,事实上,它非常轻,并且经过了正确的导入和 tree-shaken,它的大小可以忽略不计,但如果一开始就不需要它,为什么还要费心去做这些呢?

这里收集了我最喜欢的 Lodash 方法,以及如何用 ES2015+ 原生方法替换它们。有时替换是一对一的,有时则不是。我会确保注意

注意: Lodash 的方法通常非常简短易懂。如果你从未浏览过开源代码库,我强烈推荐Lodash 的 GitHub 仓库。

_.toArray:对象.值+数组.from

简单来说,就是把某个对象转换成数组。我通常用这种方法来转换查找对象,如下所示:

const postAuthors = {
  'Antonin Januska': { id: 1, name: 'Antonin Januska', role: 'author' },
  'JK Rowling': { id: 2, name: 'JK Rowling', role: 'real author' },
};
Enter fullscreen mode Exit fullscreen mode

将其放入可迭代数组中以便显示。现在,我可以使用这个方法:

const postAuthorsArray = Object.values(postAuthors);

/** result:
[
  { id: 1, name: 'Antonin Januska', role: 'author' },
  { id: 2, name: 'JK Rowling', role: 'real author' }
]
**/
Enter fullscreen mode Exit fullscreen mode

查找对象可以方便地创建唯一列表、聚合数据以及进行查找。通常情况下,该对象需要转换为数组才能用于其他用途。

那么 呢Array.from?嗯,_.toArray它支持将其他变量类型转换为数组,而不仅仅是对象。对于这些变量类型来说,Array.from这更有意义。以下是一些示例:

const dnaStrand = 'gattaca';
const dnaArray = Array.from(dnaStrand); // results in ['g', 'a', 't', 't', 'a', 'c', 'a'];

const someNumber = 3;
const result = Array.from(someNumber); // results in []. Not sure what this is used for but lodash supports this

Enter fullscreen mode Exit fullscreen mode

不幸的是,一对一的奇偶校验到此结束。Array.from 和 Object.values 都不支持将 null 转换为空数组。

_.clone:对象/数组扩展

克隆对象或数组非常有用。无论哪种情况,操作结果都意味着不会影响源数据。它还可以用于基于某些模板创建新的对象/数组。

JavaScript 没有 deepClone 的快捷方式,因此请谨慎使用,嵌套对象不会被克隆,引用会被保留。此外,克隆对象数组可以安全地操作数组,而不是对象本身。

有几种方法可以达到相同的结果,我将坚持使用对象/数组扩展:

const clonedObject = { ...sourceObject };
const clonedArray = [ ...sourceArray ];
Enter fullscreen mode Exit fullscreen mode

与 lodash 不同,使用 JavaScript 的内置方法需要知道它们的类型。你无法将对象展开到数组中,也无法将数组展开到对象中以实现克隆。

.assign/ .extend:对象.assign

赋值/扩展允许你将一个对象“合并”到另一个对象中,并覆盖其原始属性(注意:这与有一些注意事项的用法不同_.merge)。实际上,我一直在用这个!

为了在没有 lodash 的情况下实现这一点,您可以使用Object.assignlodash 文档甚至引用的内容。

const sourceObject = { id: 1, author: 'Antonin Januska' };

Object.assign(sourceObject, {
  posts: [],
  topComments: [],
  bio: 'A very cool person',
});

/** result:
{
  id: 1,
  author: 'Antonin Januska',
  posts: [],
  topComments: [],
  bio: 'A very cool person',
}

note: this is still sourceObject
**/
Enter fullscreen mode Exit fullscreen mode

Object.assign 将使用第二(第三、第四等)个参数来填充sourceObject

如果你希望结果是一个新对象并且保持不变性,该怎么办?很简单,只需指定一个空对象作为第一个参数!

const sourceObject = { id: 1, author: 'Antonin Januska' };

const finalObject = Object.assign({}, sourceObject, {
  posts: [],
  topComments: [],
  bio: 'A very cool person',
});

// note: sourceObject is a separate object from finalObject in this scenario

Enter fullscreen mode Exit fullscreen mode

事实上,在对象传播之前,你只需要做Object.assign({}, whateverObject)一个浅克隆。

奖励:_.flatten:Array.smoosh

Flatten 曾被考虑纳入 EcmaScript,但由于各种问题,有人(开玩笑?)提议将其重命名为smoosh。我对此事有自己的看法,但希望不久的将来,您就能Array.smoosh在您喜欢的深层嵌套数组上使用它。

那么 flatten/smoosh 是做什么的呢?它接受一个数组,然后将其合并成一个数组。假设某个 API 查看了你的 Twitter 列表,并从每个列表中挑选出最好的推文,而你想将它们合并成一个独立的 feed,那么你可以使用 flatten 来实现:

const sourceArray = [
  [ 'tweet 1', 'tweet 2', 'tweet 3'],
  [ 'tweet 4', 'tweet 5'],
  [ 'tweet 6', 'tweet 7', 'tweet 8', 'tweet 9']
];

const feed = Array.smoosh(sourceArray);

/** result:
[ 'tweet 1', 'tweet 2', 'tweet 3', 'tweet 4', 'tweet 5', 'tweet 6', 'tweet 7', 'tweet 8 ', 'tweet 9' ];
**/
Enter fullscreen mode Exit fullscreen mode
鏂囩珷鏉ユ簮锛�https://dev.to/antjanus/you-might-not-need-lodash--khj
PREV
路线图 - 高级 Java 开发人员 2024
NEXT
您最喜欢的 Linux 实用程序/生产力工具是什么?