如何正确链接lodash函数调用

时间:2018-10-12 10:04:17

标签: javascript sorting lodash

我需要对对象数组进行排序,然后从中获取第一项。如何在lodash中实现这一目标?

_.sortBy(window.locations, [{ 'is_primary': 'desc' }])

这给了我适当的排序数组。如何使用_.first()函数从中获取第一个元素?可能连锁他们?

2 个答案:

答案 0 :(得分:2)

您可以使用_.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中:)

答案 1 :(得分:1)

首先让我们注意_.sortBy,以便您知道并且不要感到困惑,为什么他们俩都做同样的事情。

_.sortBy_.orderBy之间也有差异,需要经常注意,也应注意:

_.orderBy将允许您按破折号short表示法或通过函数进行排序,但只能按升序

chaining的作用相同,但是允许您指定多个字段及其排序顺序(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']));

最后Three.js with instancing - can't get it to work without FrustumCulling = false的总体目的是为了方便和易读。如果您有2个以上的操作,则读取起来会比较棘手,因此规则通常是:如果大于2,则链接,但等于或小于2,则不然。

使用链接的大多数示例都将其应用于两个以上的操作。

此外,正如刚刚指出的那样,您需要lodash中可能不需要的额外代码。