如何根据数字数组对对象数组排序?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
相关产品推荐
相关产品推荐

