javascript - 两次调用javascript排序函数的不同输出
问题描述
我在javascript中遇到排序问题。我写了一个简单的排序函数,我希望 null 元素在顶部:
这是功能:
var mySort = function(a, b) {
if (!a && !b) return 0;
if (!a) return -1;
if (!b) return -1;
if (a > b) return 1;
if (a < b) return -1;
return 0;
}
我们以下面的数组为例:
var array = [1, 9, 4, 8, null, 2, 3, 4, null, 6, 3, 2, 8, 9, 5];
通过调用array.sort(mySort)
非空值总是排序,但空值位置交替从数组的开头和结尾:
Odd calls: [null, null, 1, 2, 2, 3, 3, 4, 4, 5, 6, 8, 8, 9, 9]
Even calls: [1, 2, 2, 3, 3, 4, 4, 5, 6, 8, 8, 9, 9, null, null]
为什么?
编辑:
在评论中,HMR 将我引向算法中的错误:if (!b) return -1;
应该是if (!b) return 1;
. 现在它适用于刺痛和数字。
解决方案
您需要使用两个项目之间的关系。如果两个项目都是null
,那么什么都不改变,如果你有一个null
值,那么它取决于位置。
最好的方法是检查项目并获取检查的增量进行排序。
function mySort(a, b) {
return (b === null) - (a === null) || a - b;
}
var array = [1, 9, 4, 8, null, 2, 3, 4, null, 6, 3, 2, 8, 9, 5];
array.sort(mySort);
console.log(array);
array.sort(mySort);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- laravel - 丢失 Laravel 管理员密码
- python - 如何通过对索引向量的广播进行切片来修改 np 数组?
- java - 如何通过改造在正文中发送 2 个参数?
- python - Telethon 问题,需要从频道读取消息
- google-cloud-firestore - 按文档数组中的项目查询,并按项目在数组中的位置排序
- ruby-on-rails - 维护从旧数据库到 Rails 的模型关系?
- aws-lambda - AWS Step 函数是否使延迟高于直接 Lambda 调用链?
- apache-kafka - 在这个用例中如何使用 Apache Kafka
- vue.js - 使用 Jest 测试时未定义全局节点配置变量
- filter - 结合 PowerBI DAX 筛选器和 SELECTCOLUMN