如何实现对对象数组按指定属性排序,同时将缺失该属性的对象排在首位?
实现自定义数组排序逻辑的方法
嘿,这个排序需求很明确,我之前也处理过类似的场景,用JavaScript的Array.sort()方法就能轻松搞定,核心是自定义排序规则,咱们一步步来:
排序规则拆解
- 优先级最高:缺失
order属性的元素直接排在数组首位 - 其余元素:按照
order属性的值进行升序排列
代码实现
const testWidgetOrderSort = [ { "_id": "name", "order": 1 }, { "_id": "is", "order": 2 }, { "_id": "my", "order": 0 }, { "_id": "oh I would be very first" }, { "_id": "adam", "order": 3 } ]; const sortedArray = testWidgetOrderSort.sort((a, b) => { // 处理缺失order的情况:a缺失则排到b前面,b缺失则a排到后面 if (!a.hasOwnProperty('order')) return -1; if (!b.hasOwnProperty('order')) return 1; // 都有order属性时,按值升序排列 return a.order - b.order; }); console.log(sortedArray);
代码说明
- 用
hasOwnProperty()检查order属性是否存在,比直接判断a.order === undefined更严谨,能避免元素继承来的同名属性干扰判断 - 排序函数的返回值规则:返回
-1表示a排在b前面,返回1表示b排在a前面,返回0则两者位置不变 - 有
order属性的元素直接用a.order - b.order实现升序,这是sort()方法处理数字排序的常规写法
验证输出
运行代码后,输出结果和你预期的完全一致:
[ { _id: 'oh I would be very first' }, { _id: 'my', order: 0 }, { _id: 'name', order: 1 }, { _id: 'is', order: 2 }, { _id: 'adam', order: 3 } ]
内容的提问来源于stack exchange,提问作者Avelanche
相关产品推荐
相关产品推荐

