最近在做个项目,主要涉及到页面上面的排序,有个特点,这个排序除了涉及到数字,汉字排序,还有'-',这是符号是因为无法获取到对应的
数值,在页面上使用'-'进行展示。在进行排序的时候,直接使用了javascript内置的排序算法,就是冒泡排序,基本原理就是,你只要告诉我
如何比较这两个值,它就可以进行冒泡排序。由于数量不是很多,所以还没有太多的涉及到时间和空间复杂度。中间由于这个我被弄晕了好几
次,比如下面是部分的比较结果:
参数 |
描述 |
sortby |
可选。规定排序顺序。必须是函数。 |
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回-1(一个小于 0 的值)
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回1(一个大于 0 的值)
顺序:v1=0.41; v2=-; value=-1;
顺序:v1=-; v2=0.91; value=1;
顺序:v1=-; v2=-; value=0;
顺序:v1=1.26; v2=0.56; value=1 顺序:v1=1.26; v2=2.51; value=-1
从上面的排序结果看,如果是顺序,前面比后面的值大,返回1,表明需要调换位置。如果后面的值要大,则返回-1,不需要调换位置。在对'-'进行排序的时候,进行专门的处理即可。
倒序:v1=1.26; v2=5.47; value=1
倒序:v1=1.26; v2=0.89; value=-1
倒序:v1=-; v2=2.51; value=1;
倒序:v1=-; v2=-; value=1;
倒序:v1=27.77; v2=-; value=-1;
从上面的排序结果看,如果是倒序,前面比后面的值大,返回-1,表明不需要调换位置。如果后面的值要大,则返回1,不需要调换位置。在对'-'进行排序的时候,进行专门的处理即可。
大致的方法如下:
/** * 数据的排序 * * @returns function引用,正向排序和反向排序 */ var domOrder = (function(){ return { /** * 对于一个dom结构的数组,我们通过传入的index,指的是按照第几个td的值进行顺序排列 * (1)是数字,按照数字的方式进行排序 * (2)是汉字,按照汉字的方式进行排序 * (3)为空, 按照属性值的方式进行排序 */ compareDomAsc : function(index) { return function (dom1, dom2) { var value1 = $(dom1).find("td").eq(index).html(); var value2 = $(dom2).find("td").eq(index).html(); // alert('v=' + value1 + ';v2=' + value2); if (value1 == '-' && value2 != '') { //writeTest('顺序:v1=' + value1 + '; v2=' + value2 + '; value=1;'); return 1; } else if (value1 != '' && value2 == '-') { //writeTest('顺序:v1=' + value1 + '; v2=' + value2 + '; value=-1;'); return -1; } else if (value1 == '-' && value2 == '-') { //writeTest('顺序:v1=' + value1 + '; v2=' + value2 + '; value=0;'); return 0; } else if (isNaN(value1) && isNaN(value2)) { return value1.localeCompare(value2) * -1; //汉字 } else if (!isNaN(value1) && !isNaN(value2)) { //writeTest('顺序:v1=' + value1 + '; v2=' + value2 + '; value=' + domOrder.compareNum(value1, value2)); return domOrder.compareNum(value1, value2); } else { var class1 = $(dom1).find("td").eq(index).attr("class"); //评星评级 var class2 = $(dom2).find("td").eq(index).attr("class"); var cv1 = parseInt(class1.slice('-1')); var cv2 = parseInt(class2.slice('-1')); return domOrder.compareNum(cv1, cv2); } // if (value1 != '') { // if (isNaN(value1)) { // //writeTest('顺序:v=' + value1 + '; v2=' + value2 + '; localeCompare: value=' + value1.localeCompare(value2) * -1); // return value1.localeCompare(value2) * -1; //汉字 // } else { // //writeTest('顺序:v=' + value1 + '; v2=' + value2 + '; value=' + domOrder.compareNum(value1, value2)); // return domOrder.compareNum(value1, value2); // } // } }; }, /** * 对于一个dom结构的数组,我们通过传入的index,指的是按照第几个td的值进行顺序排列 * (1)是数字,按照数字的方式进行排序 * (2)是汉字,按照汉字的方式进行排序 * (3)为空, 按照属性值的方式进行排序 */ compareDomDesc : function(index) { return function (dom1, dom2) { var value1 = $(dom1).find("td").eq(index).html(); var value2 = $(dom2).find("td").eq(index).html(); // alert('v=' + value1 + ';v2=' + value2); if (value1 == '-' && value2 != '') { //writeTest('倒序:v1=' + value1 + '; v2=' + value2 + '; value=1;'); return 1; } else if (value1 != '' && value2 == '-') { //writeTest('倒序:v1=' + value1 + '; v2=' + value2 + '; value=-1;'); return -1; } else if (value1 == '-' && value2 == '-') { //writeTest('倒序:v1=' + value1 + '; v2=' + value2 + '; value=0;'); return 0; } else if (isNaN(value1) && isNaN(value2)) { return value1.localeCompare(value2) * -1; //汉字 } else if (!isNaN(value1) && !isNaN(value2)) { //writeTest('倒序:v1=' + value1 + '; v2=' + value2 + '; value=' + domOrder.compareNum(value1, value2) * -1); return domOrder.compareNum(value1, value2) * -1; } else { var class1 = $(dom1).find("td").eq(index).attr("class"); //评星评级 var class2 = $(dom2).find("td").eq(index).attr("class"); var cv1 = parseInt(class1.slice('-1')); var cv2 = parseInt(class2.slice('-1')); return domOrder.compareNum(cv1, cv2) * -1; } }; }, /** * 比较两个数字的大小,num1>num2,返回1,=返回0,否则返回-1 */ compareNum : function(n1, n2) { var num1 = parseFloat(n1); var num2 = parseFloat(n2); if (num1 > num2) { return 1; } else if (num1 == num2) { return 0; } else { return -1; } } }; })(); orderedArr = dataArray.sort(domOrder.compareDomAsc(index));
如果需要对产生的文件进行合并处理:
这个时候文件就会生成一个文件,进行排序处理。