You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lodash根据对象值对嵌套对象数组排序的问题

解决Lodash按嵌套数组值排序对象数组的问题

你遇到的问题主要来自两个点:一是直接用'moves.difference'作为排序键时,Lodash没法正确处理嵌套数组的情况(moves是数组,本身没有difference属性);二是你期望的结果里每个drive的moves数组本身也需要按difference排序,这一步在你原始代码里缺失了。

咱们一步步来解决:

第一步:先对每个drive的moves数组排序

首先要遍历每个drive,把它内部的moves数组按difference升序排列,这样每个drive的moves数值会从小到大排列,方便后续对整个drives数组排序。

第二步:对整个drives数组排序

在处理完每个drive的moves后,我们可以基于每个drive的moves数组中第一个元素的difference(因为已经排序过,第一个就是最小的difference),对整个drives数组做升序排序。

用Lodash的链式调用可以很简洁地实现这两步:

const sortedDrives = _.chain(drives)
  // 先处理每个drive的moves数组,按difference升序排列
  .map(drive => ({
    ...drive,
    moves: _.orderBy(drive.moves, 'difference', 'asc')
  }))
  // 再按每个drive的最小difference值排序整个数组
  .orderBy(drive => drive.moves[0].difference, 'asc')
  .value();

运行这段代码后,得到的结果就和你期望的完全一致:

[
  {id: 2, moves:[ {moveId: 1, difference: -2}] },
  {id: 1, moves:[ {moveId: 1, difference: 1}, {moveId: 2, difference: 2}] },
  {id: 3, moves:[ {moveId: 2, difference: 2}, {moveId: 3, difference: 4}, {moveId: 1, difference: 5}] },
  {id: 4, moves:[ {moveId: 1, difference: 6}] }
]

如果你的排序逻辑不是基于最小difference,而是其他规则(比如所有difference的平均值),只需要修改orderBy的第二个参数即可,举个例子:

// 按所有difference的平均值排序整个drives数组
.orderBy(drive => _.meanBy(drive.moves, 'difference'), 'asc')

内容的提问来源于stack exchange,提问作者michaelT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:59:32