Lodash orderBy 对嵌套对象数组的影响

发布于 2025-01-12 01:01:04 字数 1044 浏览 3 评论 0原文

拥有一个具有某些嵌套属性的对象数组:

const sports = [{
  name: "Basketball",
  leagues: [{
     createdAt: 1
  }, {
     createdAt: 2
  }]
},{
  name: "Soccer",
  leagues: [{
     createdAt: 3
  }, {
     createdAt: 4
  }]
}]

要获取按名称 DESC (Z->A) (非嵌套属性)排序的对象数组,我会这样做:

const sorted = _.orderBy(sports, item => item.name, ['desc']); 

结果是

[{ name: "Soccer", ... },{ name: "Basketball", ... }] 

我想要实现的是基于该对象进行排序在其嵌套的对象数组上 leagues.createdAt DESC (假设 1,2,3,4 是正确的时间戳):

[{
  name: "Soccer",
  leagues: [{
     createdAt: 4
  }, {
     createdAt: 3
  }]
},{
  name: "Basketball",
  leagues: [{
     createdAt: 2
  }, {
     createdAt: 1
  }]
}]

尝试这样做:

const sorted = _.orderBy(sports, [(item) => item.leagues[0].createdAt], ["desc"])

但顺序不太正确:

在此处输入图像描述

Have an array of objects with some nested properties:

const sports = [{
  name: "Basketball",
  leagues: [{
     createdAt: 1
  }, {
     createdAt: 2
  }]
},{
  name: "Soccer",
  leagues: [{
     createdAt: 3
  }, {
     createdAt: 4
  }]
}]

To get the array of object sorted by name DESC (Z->A) (non nested property) I do:

const sorted = _.orderBy(sports, item => item.name, ['desc']); 

The result is

[{ name: "Soccer", ... },{ name: "Basketball", ... }] 

What I am trying to achieve is to sort this object based on its nested array of objects leagues.createdAt DESC (assuming 1,2,3,4 are the correct timestamps):

[{
  name: "Soccer",
  leagues: [{
     createdAt: 4
  }, {
     createdAt: 3
  }]
},{
  name: "Basketball",
  leagues: [{
     createdAt: 2
  }, {
     createdAt: 1
  }]
}]

Tried to do smth like that:

const sorted = _.orderBy(sports, [(item) => item.leagues[0].createdAt], ["desc"])

but the order is not quite right:

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我最亲爱的 2025-01-19 01:01:04

您需要映射有序数组,并使用 _.orderBy()leagues 进行排序。我使用 _.flow() 创建一个函数,该函数首先对整个数组进行排序,然后对每个对象中的 leagues 进行映射和排序。

const { flow, orderBy, map } = _

const fn = flow(
  arr => orderBy(arr, 'name', 'desc'),
  arr => map(arr,  ({ leagues, ...o }) => ({
    ...o,
    leagues: orderBy(leagues, 'createdAt', 'desc')
  }))
)

const sports = [{"name":"Basketball","leagues":[{"createdAt":1},{"createdAt":2}]},{"name":"Soccer","leagues":[{"createdAt":3},{"createdAt":4}]}]

const result = fn(sports)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

You'll need to map the ordered array, and sort the leagues using _.orderBy(). I'm using _.flow() to create a function that first sorts the entire array, and then maps and sorts the leagues in each object.

const { flow, orderBy, map } = _

const fn = flow(
  arr => orderBy(arr, 'name', 'desc'),
  arr => map(arr,  ({ leagues, ...o }) => ({
    ...o,
    leagues: orderBy(leagues, 'createdAt', 'desc')
  }))
)

const sports = [{"name":"Basketball","leagues":[{"createdAt":1},{"createdAt":2}]},{"name":"Soccer","leagues":[{"createdAt":3},{"createdAt":4}]}]

const result = fn(sports)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文