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

如何根据数字数组对对象数组排序?Lodash sortBy失效求助

解决按指定顺序排列对象数组的问题

你的问题出在对_.sortBy的用法理解上:sortBy的第二个参数传入数组时,是指定要排序的属性名列表,而不是你期望的「排序顺序参照数组」。另外keys里的元素是字符串类型,对象的id是数字类型,类型不匹配也导致无法正确关联。

下面提供两种可行的解决方法:

方法一:基于_.sortBy调整排序依据

通过传入自定义函数,返回对象id在keys数组中的索引值,以此作为排序依据。注意要统一id和keys的类型:

import * as _ from 'lodash';

let keys = [ '10001', '10002', '10004' ];
let c = [
  { name: 'John', id: 10004 },
  { name: 'Alice', id: 10001 },
  { name: 'Bob', id: 10002, is_app: 1 }
];

// 将对象id转为字符串,匹配keys的类型后取索引
const result = _.sortBy(c, item => keys.indexOf(item.id.toString()));
console.log(result);

如果不想转换类型,也可以先把keys转为数字数组:

const numKeys = keys.map(Number);
const result = _.sortBy(c, item => numKeys.indexOf(item.id));

方法二:用映射表+遍历生成结果(更高效)

如果数组规模较大,indexOf的O(n)查找会影响性能,建议先构建id到对象的映射表,再按keys顺序直接取对应对象:

import * as _ from 'lodash';

let keys = [ '10001', '10002', '10004' ];
let c = [
  { name: 'John', id: 10004 },
  { name: 'Alice', id: 10001 },
  { name: 'Bob', id: 10002, is_app: 1 }
];

// 构建id(转字符串)到对象的映射
const idToObj = _.keyBy(c, item => item.id.toString());
// 按keys顺序生成结果数组
const result = keys.map(key => idToObj[key]);
console.log(result);

这种方法的查找效率是O(1),整体时间复杂度为O(n),比排序的O(n log n)更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:27