如何按指定数组顺序排序对象数组?现有代码未达预期求解决
按指定数组顺序排序的解决方案
你的问题出在indexOf对不存在的元素返回-1,导致不在sortArray里的元素(比如示例中的"2")会被排在最前面——因为-1比任何存在的索引都小,打乱了预期顺序。
要实现sortArray中的元素优先按顺序排列,其余元素放在后面的效果,可以修改排序逻辑:
- 对每个元素,若在sortArray中存在,取它的索引;若不存在,用
sortArray.length作为索引(确保这些元素排在所有指定元素之后) - 再用处理后的索引进行比较
修正后的代码
type ArrayTypes = { name: string }; const sortMarkets = (array: ArrayTypes[], sortArray: string[]) => { return [...array].sort((a, b) => { const indexA = sortArray.indexOf(a.name); const indexB = sortArray.indexOf(b.name); // 把不存在的元素索引设为sortArray的长度,让它们排在后面 const posA = indexA === -1 ? sortArray.length : indexA; const posB = indexB === -1 ? sortArray.length : indexB; return posA - posB; }); }; // 测试示例 const array1 = [ { name: "1" }, { name: "2" }, { name: "3" } ]; const array2 = ["3", "1"]; console.log(sortMarkets(array1, array2)); // 输出结果:[{name: "3"}, {name: "1"}, {name: "2"}]
优化建议(性能提升)
如果数组元素较多,indexOf每次遍历sortArray会影响性能,可以先把sortArray转成映射表,将值和索引对应起来,这样查找索引的时间复杂度从O(n)降到O(1):
type ArrayTypes = { name: string }; const sortMarkets = (array: ArrayTypes[], sortArray: string[]) => { // 先构建索引映射表 const sortMap = new Map<string, number>(); sortArray.forEach((item, index) => sortMap.set(item, index)); return [...array].sort((a, b) => { const posA = sortMap.get(a.name) ?? sortArray.length; const posB = sortMap.get(b.name) ?? sortArray.length; return posA - posB; }); };
内容的提问来源于stack exchange,提问作者Simon Santana
相关产品推荐
相关产品推荐

