如何将指定数组包含的对象元素排到列表末尾(支持lodash/原生JS)
错误原因
你的排序权重写反了。_.sortBy 是按迭代函数返回值从小到大排序的,你给uid在found里的项返回0(更小值)、不在的返回1(更大值),结果自然是匹配到的项排到最前面,和你要放去末尾的需求刚好反过来。
另外如果found数组长度比较大,反复调用Array.includes()查找的效率很低,建议先转成Set存储目标uid,查找复杂度可以从O(n)降到O(1),性能更好。
实现方案
Lodash 修正写法
把权重返回值调换即可,匹配到found的项返回更大的权重值,就会被排到列表尾部:
const foundSet = new Set(found); const setItemsLast = _.sortBy(attendList, ({ uid }) => foundSet.has(uid) ? 1 : 0);
原生JS写法
如果不想引入lodash,可以用原生数组的sort方法实现,注意先浅拷贝原数组避免修改原始数据:
const foundSet = new Set(found); const setItemsLast = [...attendList].sort((itemA, itemB) => { const weightA = foundSet.has(itemA.uid) ? 1 : 0; const weightB = foundSet.has(itemB.uid) ? 1 : 0; return weightA - weightB; });
上述两种实现都是稳定排序,非目标项、目标项组内的原有相对顺序都会被保留,符合常规业务需求。
内容的提问来源于stack exchange,提问作者FabricioG
相关产品推荐
相关产品推荐

