使用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
相关产品推荐
相关产品推荐

