如何按对象内status字段字母顺序排序列表,让NOT_FOUND优先
问题解决:按指定status顺序排序数组元素
你的代码里用b.status - a.status比较字符串是错误的——JavaScript中字符串做减法运算会被转换为数字,结果是NaN,导致排序逻辑失效,所以数组顺序没变化。
要实现NOT_FOUND在前、OK在后的排序,有两种简单的实现方式:
方法一:自定义优先级映射
这种方式扩展性更强,后续新增其他status值时只需修改映射表即可:
let elements = [ { "distance": { "text": "1.6 km", "value": 1550 }, "duration": { "text": "6 mins", "value": 358 }, "status": "OK" }, { "status": "NOT_FOUND" } ]; // 定义status的优先级,数值越小排序越靠前 const statusPriority = { "NOT_FOUND": 0, "OK": 1 }; elements.sort(function(a, b) { // 处理可能不存在status的情况,默认排最后 const aPriority = statusPriority[a.status] ?? 2; const bPriority = statusPriority[b.status] ?? 2; return aPriority - bPriority; }); console.log(elements);
方法二:利用字符串比较(localeCompare)
因为"NOT_FOUND"的字母顺序本来就在"OK"之前,直接用字符串比较即可:
let elements = [ { "distance": { "text": "1.6 km", "value": 1550 }, "duration": { "text": "6 mins", "value": 358 }, "status": "OK" }, { "status": "NOT_FOUND" } ]; elements.sort(function(a, b) { if (a.status && b.status) { // localeCompare返回负数表示a排在b前,正数则相反 return a.status.localeCompare(b.status); } // 没有status的元素默认排最后 return a.status ? -1 : 1; }); console.log(elements);
两种方法都能实现你要的效果,第一种更适合后续有更多status类型的场景,第二种则更简洁直接。
内容的提问来源于stack exchange,提问作者aasir khan
相关产品推荐
相关产品推荐

