【问题标题】:Lodash sortBy: order by Boolean with if conditionLodash sortBy: 使用 if 条件按布尔值排序
【发布时间】:2018-04-17 14:19:09
【问题描述】:

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

我可以像这样按布尔值对数组进行排序(我知道你也可以省略 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:我没有收到任何错误,只是排序不正确。

干杯

【问题讨论】:

  • 只是出于好奇,post.date > 怎么能比今天呢?这是一个未来派的时间旅行帖子吗?或者这是某种过时的价值?
  • 您可以添加您的posts 的样本吗?
  • post.datetoday的类型是什么?它们是整数吗?如果不是,它可能不会按照您认为的方式进行排序。
  • 我不认为传递给sortBy 的函数意味着内部有分支语句。您通常返回要在排序中与之比较的值。在您的代码中,您说在某些元素中应该比较的是post,在其他一些元素中应该比较的是undefined
  • @RyanWilson 这是关于事件的帖子,当它们被写入时,它是关于未来事件的。

标签: javascript arrays sorting lodash


【解决方案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 是如何工作的。

感谢您的帮助。干杯

【讨论】:

    【解决方案2】:

    您的解决方案有点随机,我认为它很难理解/适应。

    这个呢?

    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))
    ]
    

    【讨论】:

    • 我已经检查了 orderBy 但我再次无法获得附加条件。我想要实现的目标:我想要一个数组,其中包含featured_post=true 的帖子位于前面。但仅当他们的日期不是过去时。所以我需要这个额外的条件......我的解决方案有效,所以我想没关系......
    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多