javascript - Javascript 对 HTML 表中的空值排序错误
问题描述
我正在使用下面的 JavaScript 代码按字母和数字对表格进行排序。但是,它将具有null
值的行放在顶部而不是底部。
在下图中,取自我正在处理的这个URL,当在 Rank Change 列中从大到小对表格进行排序时,空值位于顶部而不是底部。
*在此表中,Null
值是带有 NEW 标记或破折号的单元格。*该问题适用于所有列/行
不应该将 Null 归类为小于 1 并按此类排序吗?我究竟做错了什么?
非常感谢任何帮助。
const getCellValue = (tr, idx) => tr.children[idx].innerText || tr.children[idx].textContent;
const comparer = (idx, asc) => (a, b) => ((v1, v2) =>
v1 !=='' && v2 !=='' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2)
)(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));
document.querySelectorAll('th').forEach(th => th.addEventListener('click', (() => {
const table = th.closest('table');
Array.from(table.querySelectorAll('tr:nth-child(n+2)'))
.sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc))
.forEach(tr => table.appendChild(tr) );
})));
解决方案
您可以null
先检查值,然后检查两个值的有限性,例如可强制为数字的数字或字符串,然后获取数字的增量或按字符串排序。
例子:
v1 v2 (v1 === null) - (v2 === null) isFinite(v1) && isFinite(v2) result
---- ---- ----------------------------- ---------------------------------------- ------
null null true - true -> 0 true -> v1 - v2 0
null abc true - false -> 1 1
null 2 true - false -> 1 1
abc null false - true -> -1 -1
2 null false - true -> -1 -1
abc abc false - false -> 0 false -> v1.toString().localeCompare(v2) 0
abc 2 false - false -> 0 false -> v1.toString().localeCompare(v2) 1
2 abc false - false -> 0 false -> v1.toString().localeCompare(v2) -1
2 2 false - false -> 0 true -> v1 - v2 0
代码:
const comparer = (idx, asc) => (a, b) => ((v1, v2) =>
(v1 === null) - (v2 === null) ||
(isFinite(v1) && isFinite(v2)
? v1 - v2
: v1.toString().localeCompare(v2)
)
)(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));
工作示例:
var array = [null, 2, 1, 20, 11, 'b', 'aaa', 'a', null];
array.sort((v1, v2) =>
(v1 === null) - (v2 === null) ||
(isFinite(v1) && isFinite(v2)
? v1 - v2
: v1.toString().localeCompare(v2)
)
);
console.log(...array);
推荐阅读
- angular - 错误:多个组件与标记名 app-contact 的节点匹配
- mysql - 如何通过修复mysql中的这个语法错误来创建一个表?
- javascript - 发现 1 个低严重性漏洞错误,同时创建新的反应项目
- python - Django] 我的注册表单不起作用
- github - 无法在降价文件中从 GitHub 加载图像
- wso2 - 将 xml 转换为 json 的 WSO2 ESB 问题
- r - DiagrammeR 和 R Markdown pdf:删除图表周围的空间?
- ruby-on-rails - Rails、Webpack 和 FontAwesome,如何停止转换为 SVG?
- python - 怎么去掉空
带有美丽汤的标签 4
- hive - 命名 hive 会话有时无法工作