JS对象数组按values降序排序时固定Other、Unknown在末尾两位的实现
对象数组自定义排序实现方案
有两种常见实现方式可以满足你的需求:
方案1:拆分分类后拼接(逻辑更直观,易维护)
先把数组按index属性拆分为普通元素、Other元素、Unknown元素三类,仅对普通元素做values降序排序,最后按需求顺序拼接即可:
// 拆分不同类型的元素 const normalList = myDataSet.filter(item => item.index !== 'Other' && item.index !== 'Unknown'); const otherItem = myDataSet.find(item => item.index === 'Other'); const unknownItem = myDataSet.find(item => item.index === 'Unknown'); // 仅对普通元素按values降序排序 normalList.sort((a, b) => parseFloat(b.values) - parseFloat(a.values)); // 按顺序拼接得到最终结果 const finalResult = [...normalList]; otherItem && finalResult.push(otherItem); unknownItem && finalResult.push(unknownItem);
方案2:自定义排序优先级(单次排序完成,代码更简洁)
直接在排序比较函数中增加优先级判断,把Unknown的优先级设为最低,Other次之,普通元素优先级最高,优先级相同的普通元素再按values降序排序:
const sortedResult = myDataSet.sort((a, b) => { // 定义优先级规则:普通元素 > Other > Unknown const getLevel = (item) => { if(item.index === 'Unknown') return -1; if(item.index === 'Other') return 0; return 1; } const levelA = getLevel(a); const levelB = getLevel(b); // 优先级不同时按优先级排序 if(levelA !== levelB) { return levelB - levelA; } // 优先级相同时按values降序排序 return parseFloat(b.values) - parseFloat(a.values); })
错误原因说明
你之前写的连续两次filter逻辑存在问题:第一次筛选出index为Other的元素后,返回的数组中仅包含符合Other条件的元素,第二次再筛选index为Unknown的元素会得到空数组,自然无法得到正确结果。
内容的提问来源于stack exchange,提问作者chewback2001
相关产品推荐
相关产品推荐

