JavaScript使用限制对列表进行排序
我在Electron上制作了一个应用程序,有一个客户名单,上面有他们的姓名和位置。我有一个按钮,允许用户添加客户,但这样做时,表中会显示索引。我有另一个按钮,按字母顺序排列名称,但如果有行中有索引,它会首先显示这些行 我想要的是一些限制,当排序时,将带有(0)(1)的行放在列表的末尾,而不是开始 例如: 客户的排序是正确的,但是当我希望单词在0之前时,所有带0的行都在带实际单词的行之前 代码: 由于某些原因,在这个代码段中,它实际上没有显示0或1索引,但它仍然在带有文本的行之前对没有任何内容的行进行排序JavaScript使用限制对列表进行排序,javascript,html,css,list,sorting,Javascript,Html,Css,List,Sorting,我在Electron上制作了一个应用程序,有一个客户名单,上面有他们的姓名和位置。我有一个按钮,允许用户添加客户,但这样做时,表中会显示索引。我有另一个按钮,按字母顺序排列名称,但如果有行中有索引,它会首先显示这些行 我想要的是一些限制,当排序时,将带有(0)(1)的行放在列表的末尾,而不是开始 例如: 客户的排序是正确的,但是当我希望单词在0之前时,所有带0的行都在带实际单词的行之前 代码: 由于某些原因,在这个代码段中,它实际上没有显示0或1索引,但它仍然在带有文本的行之前对没有任何内容的
const back=document.getElementById('back');
const cust=document.getElementById('cust');
const custDiv=document.getElementById('custDiv');
const addCust=document.getElementById('addCust');
const inv=document.getElementById('inv');
const invDiv=document.getElementById('invDiv');
const addItem=document.getElementById('addItem');
//添加客户
函数appendRowCust(){
var custList=document.getElementById('custList'),//表引用
row=custList.insertRow(custList.rows.length),//追加表行
我
//将表格单元格插入新行
对于(i=0;iy.innerHTML.toLowerCase()){
//因此,标记为开关并断开循环:
shouldSwitch=true;
打破
}
}
如果(应切换){
/*如果开关已被标记,则进行更换
并标记开关已完成:*/
行[i].parentNode.insertBefore(行[i+1],行[i]);
切换=真;
}
}
}
表格{
背景色:黑色;
颜色:白色;
}
tr:n个孩子(偶数){
背景色:#6565;
}
tr:n个孩子(奇数){
背景色:#505050;
}
运输署{
宽度:300px;
最大宽度:300px;
高度:30px;
文本对齐:居中;
}
添加客户
分类
客户
主要位置
某人
某物
您可以通过尝试转换为数值并确定当前迭代值是否为整数来过滤差异。之后,只需对两个结果集进行排序和连接
var list = [0, 2, "2", "0", 1, 2, "a", "b", "c"],
numeric = list.filter(value => Number.isInteger(+value)),
alpha = list.filter(value => !Number.isInteger(+value)),
result = alpha.sort().concat(numeric.sort());
要优化以上内容,您可以过滤一次,如果结果为false,则推送到单独声明的数组alpha
var list = [0, 2, "2", "0", 1, 2, "a", "b", "c"],
alpha = [],
numeric = list.filter(value => {
let torf = Number.isInteger(+value);
if (!torf) alpha.push(value);
return torf;
}),
result = alpha.sort().concat(numeric.sort());
确定两者之间的差异将是一个微观优化,我怀疑这在任何情况下都是必要的,而前者更详细、更清晰。我的建议是使用第一种选择
var list=[0,2,2,0,1,2,a,b,c”],
numeric=list.filter(值=>Number.isInteger(+value)),
alpha=list.filter(值=>!Number.isInteger(+value)),
结果=alpha.sort().concat(numeric.sort());
控制台日志(结果)代码>首先,您需要总结您的规范是什么。据我理解,它们是:
- 您的表需要按字典顺序按第一列排序
- 数字或空字符串除外,它们需要在列中最后排序
现在,@ IrkCiNeNADER给出的答案是正确的,指出你不需要编写你自己的排序算法,但是就实现一个正确和有效的解决方案而言,考虑使用内置的算法<代码>数组^ SO()/<代码>修改:
function sortCustTable() {
var custList = document.getElementById('custList');
var rows = custList.getElementsByTagName('tr');
var parent = rows[0].parentElement;
var length = rows.length;
var data = [], ref, charCodes;
for (var index = 0; index < length; index++) {
ref = {
row: rows[index],
value: rows[index].firstElementChild.textContent.toUpperCase()
};
if (ref.value === '') {
ref.value = 'k'; // will sort after everything else, including numbers
} else if (!isNaN(ref.value)) {
charCodes = ref.value.split('').map(function (char) {
return Number(char) + 97; // charCode for 'a'
});
// for example, '05' would become 'af'
ref.value = String.fromCharCode.apply(String, charCodes);
}
data.push(ref);
}
data.sort(function (a, b) {
if (a.value > b.value) return 1;
if (a.value < b.value) return -1;
return 0;
});
for (var index = 0; index < length; index++) {
parent.appendChild(data[index].row);
}
}
表格{
背景色:黑色;
颜色:白色;
}
tr:n个孩子(偶数){
背景色:#6565;
}
tr:n个孩子(奇数){
背景色:#505050;
}
运输署{
宽度:300px;
最大宽度:300px;
高度:30px;
文本对齐:居中;
}
添加客户
分类
客户
主要位置
某人
某物
某人
1.
1.
0
1.
别人
1.
别人
1.
我添加了一个从单元格内容数组中绘制表格的方法。排序行
并调用drawTableRows
将以行
数组结束时的任何顺序重新创建表。我在中添加了一些代码