【发布时间】:2018-10-13 03:57:54
【问题描述】:
我需要对一组对象进行排序,然后从中取出第一项。如何在 lodash 中实现这一点?
_.sortBy(window.locations, [{ 'is_primary': 'desc' }])
这给了我一个正确的排序数组。如何使用_.first() 函数从中获取第一个元素?可能把它们锁起来?
【问题讨论】:
标签: javascript sorting lodash
我需要对一组对象进行排序,然后从中取出第一项。如何在 lodash 中实现这一点?
_.sortBy(window.locations, [{ 'is_primary': 'desc' }])
这给了我一个正确的排序数组。如何使用_.first() 函数从中获取第一个元素?可能把它们锁起来?
【问题讨论】:
标签: javascript sorting lodash
你可以使用_.chain然后解包值:
https://lodash.com/docs/4.17.10#chain
另一种方法是将结果包装在 _.first 中,因为 lodash 受到保护,不受 undefined、空数组、null 等的影响(可能发生的最坏情况是返回空数组):
_.first(_.sortBy(window.locations, [{ 'is_primary': 'desc' }]));
关于浏览器环境中 _.chain 的旁注 - 它可能会导致您的捆绑软件显着增长(因为它可能会在您的捆绑软件中包含许多 lodash 函数),如果您担心这一点,请阅读这篇文章:
https://medium.com/making-internets/why-using-chain-is-a-mistake-9bc1f80d51ba
TL;DR 如果您正在执行简单的操作并关心输出 JS 包的大小,请坚持使用 _.first 进行包装:)
【讨论】:
stick to just wrapping in _.first 如果您使用_.flow 将函数组合在一起,则更易于阅读。使用 Lodash/FP _.flow(_.first, _.sortBy([{ 'is_primary': 'desc' }]) 会给你一个函数,然后用你的数据调用。
首先让我们注意 _.first is a alias of _.head 只是为了让您知道并且不要混淆为什么他们都做同样的事情。
另外,_.sortBy 和 _.orderBy 之间也存在差异,这总是会出现,也应该注意:
_.sortBy 允许您按 lodash short 符号或通过函数排序,但只能按升序!
_.orderBy 的作用相同,但允许您指定多个字段以及它们的排序顺序 (asc/desc)。
考虑以下示例:
var users = [
{ 'user': 'fred', 'age': 1, 'drinks': 1 },
{ 'user': 'barney', 'age': 4, 'drinks': 3 },
{ 'user': 'brat', 'age': 4, 'drinks': 6 },
{ 'user': 'josh', 'age': 2, 'drinks': 2 },
{ 'user': 'jim', 'age': 2, 'drinks': 10 },
{ 'user': 'barney', 'age': 3, 'drinks': 5}
];
const sortBy = _.sortBy(users, ['age','drinks'])
const orderBy = _.orderBy(users, ['age', 'drinks'], ['asc', 'desc'])
console.log('sortBy', sortBy)
console.log('orderBy', orderBy)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
从输出中可以看出(当用户年龄相同时),在对多个字段进行排序时,orderBy 的优势在于其便利性。
回到你的问题:
您可以使用以下任何一种:
// ONLY ASC
_.head(_.sortBy(window.locations, ['is_primary']));
_.first(_.sortBy(window.locations, ['is_primary']));
// ASC & DESC
_.head(_.orderBy(window.locations, ['is_primary'], ['desc']));
_.first(_.orderBy(window.locations, ['is_primary'], ['desc']));
最后一个chaining 主要是为了方便和可读性。如果您有超过 2 个操作,则阅读起来会很棘手,因此规则通常是如果超过 2 个则链接,但如果等于或小于则不链接。
大多数使用链接的示例都应用于两个以上的操作。
还指出只是为了链接,您需要来自 lodash 的额外代码,这可能是您不想要的。
【讨论】: