如何按条件排序对象数组:vendorBidId为null置底,bidAmount升序排列
解决方案
方法1:直接自定义排序比较函数(推荐,一次排序完成)
直接在sort方法的比较逻辑里优先处理vendorBidId的存在性优先级,再处理数值排序:
array.sort((a, b) => { // 优先判断vendorBidId是否为null的情况 const aIsNull = a.vendorBidId === null; const bIsNull = b.vendorBidId === null; // a是null、b不是:a排后面 if (aIsNull && !bIsNull) return 1; // a不是、b是null:b排后面 if (!aIsNull && bIsNull) return -1; // 都是null:保持原有相对顺序 if (aIsNull && bIsNull) return 0; // 都不是null:按bidAmount升序排序 return parseFloat(a.bidAmount) - parseFloat(b.bidAmount); }) // 验证输出 .forEach(ele => console.log(ele.bidAmount)) // 输出结果:30 40 50 131 0 0
方法2:拆分数组再拼接(逻辑更直观,易维护)
先把数组拆分为「有有效vendorBidId」和「vendorBidId为null」两部分,分别处理后再合并:
// 筛选出有vendorBidId的部分,按bidAmount升序排序 const validList = array.filter(item => item.vendorBidId !== null) .sort((a, b) => parseFloat(a.bidAmount) - parseFloat(b.bidAmount)); // 筛选出vendorBidId为null的部分,保留原有顺序 const nullList = array.filter(item => item.vendorBidId === null); // 合并得到最终结果 const result = [...validList, ...nullList]; // 验证输出 result.forEach(ele => console.log(ele.bidAmount))
原理解释
- 排序比较函数的返回值规则:返回负数则a排在b前,返回正数则b排在a前,返回0则顺序不变
- 优先判断
vendorBidId的存在性,保证所有null的项排序优先级低于非null项,自然就会全部排在数组末尾 - 非null的项之间再按
bidAmount数值升序排序,完全匹配需求
内容的提问来源于stack exchange,提问作者Sreerag G
相关产品推荐
相关产品推荐

