你可能不需要 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' },
};
将其放入可迭代数组中以便显示。现在,我可以使用这个方法:
const postAuthorsArray = Object.values(postAuthors);
/** result:
[
{ id: 1, name: 'Antonin Januska', role: 'author' },
{ id: 2, name: 'JK Rowling', role: 'real author' }
]
**/
查找对象可以方便地创建唯一列表、聚合数据以及进行查找。通常情况下,该对象需要转换为数组才能用于其他用途。
那么 呢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
不幸的是,一对一的奇偶校验到此结束。Array.from 和 Object.values 都不支持将 null 转换为空数组。
_.clone:对象/数组扩展
克隆对象或数组非常有用。无论哪种情况,操作结果都意味着不会影响源数据。它还可以用于基于某些模板创建新的对象/数组。
JavaScript 没有 deepClone 的快捷方式,因此请谨慎使用,嵌套对象不会被克隆,引用会被保留。此外,克隆对象数组可以安全地操作数组,而不是对象本身。
有几种方法可以达到相同的结果,我将坚持使用对象/数组扩展:
const clonedObject = { ...sourceObject };
const clonedArray = [ ...sourceArray ];
与 lodash 不同,使用 JavaScript 的内置方法需要知道它们的类型。你无法将对象展开到数组中,也无法将数组展开到对象中以实现克隆。
.assign/ .extend:对象.assign
赋值/扩展允许你将一个对象“合并”到另一个对象中,并覆盖其原始属性(注意:这与有一些注意事项的用法不同_.merge
)。实际上,我一直在用这个!
为了在没有 lodash 的情况下实现这一点,您可以使用Object.assign
lodash 文档甚至引用的内容。
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
**/
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
事实上,在对象传播之前,你只需要做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' ];
**/