Lodash sortBy:使用if条件按布尔顺序排序

时间:2018-04-17 14:19:10

标签: javascript arrays sorting lodash

我想根据布尔值对数组进行排序,但前提是第二个条件为真。

我可以像这样用布尔对Array进行排序(我知道你也可以省略if部分,但我想知道它是否像这样工作。

posts = sortBy(posts, [function(post) {
  if (post.featured_post === true) {
    return post
  }
}]);

但现在我想补充另一个条件:

posts = sortBy(posts, [function(post) {
  if (post.featured_post === true && post.date >= today) {
    return post
  }
}]);

但这似乎不再起作用了。我得到了相当随机的订单。 也许我也不明白如何将sortBy与函数一起使用,因此非常感谢一些帮助。

PS:我没有收到任何错误,只是没有正确排序。

干杯

2 个答案:

答案 0 :(得分:1)

由于@ gforce301的问题,我意识到我从未将事件日期转换为javascript Date对象。通过这样做:

const today = new Date().setHours(0,0,0,0)

posts = sortBy(posts, [function(post) {
   const postDate = new Date(post.date).setHours(0,0,0,0)
   if (post.featured_post && postDate >= today) {
      return post
   }
}])

我实际上让sortBy工作 - 即使是分支语句。很高兴有一个关于lodash的sortBy如何工作的另一个例子。

感谢您的帮助。干杯

答案 1 :(得分:0)

你的解决方案有点随意,我认为很难理解/适应。

这个怎么样?

import { get } from 'lodash/fp'
import { overEvery, sortBy, negate } from 'lodash'

const shouldBeFirst = overEvery(
  get('featured_post'),
  ({ date }) => (new Date(date).setHours(0,0,0,0)) == (new Date().setHours(0,0,0,0))
)

const preSortedPosts = sortBy(posts, 'date')

const sortedPosts = [
  ...preSortedPosts.filter(shouldBeFirst),
  ...preSortedPosts.filter(negate(shouldBeFirst))
]