对混合字符串和数值的列字段进行排序

时间:2016-10-21 19:00:53

标签: javascript jquery sorting

我正在尝试根据' Value'对我的列进行排序。字段,它是字符串和数值的组合,按以下顺序

var ascending = ["","","", 0, 0, 0.71, 1]

var descending = [1, 0.71,0,0,"","",""]

我尝试了以下排序算法,但它没有给出理想的结果

function mySort(v1,v2) {
var v1 = obj1[colName];
            var v2 = obj2[colName];

            if(v1 === ""){
              return 1;
            }
            else if(v2 === ""){
              return -1;
            }
            else if(v1 === v2){
              return 0;
            }
            else if(!sortObj.descending) {
              return v1 < v2 ? -1 : 1;
            }
            else if(sortObj.descending) {
              return v1 < v2 ? 1 : -1;
            }
}

上面的排序算法始终将""保持在底部,这在我的情况下是不可取的。我缺少什么?

3 个答案:

答案 0 :(得分:1)

var arr = ["", "", 0, "", 1, 0.71, 0];
var asc = arr.slice().sort();
var desc = asc.slice().reverse();

slice()方法将数组的一部分的浅表副本返回到新的数组对象中。

sort()方法对数组中的元素进行排序并返回数组。

reverse()方法可以反转数组。

答案 1 :(得分:1)

您可以先按空字符串排序,然后按数字排序。

var arr = ["", "", 0, "", 1, 0.71, 0, 10, 20, 2];

arr.sort(function (a, b) {
    return (a !== "") - (b !== "") || (a || 0) - (b || 0);
});
console.log(arr);

答案 2 :(得分:0)

从你的函数中删除那些IF语句。

    if(v1 === ""){
      return 1;
    }
    else if(v2 === ""){
      return -1;
    }

这样的数字和字符串在JS中已经具有可比性。

编辑:

要比较0,您可以在函数的开头尝试:

if(v1 === 0)
    v1 = v1.toString();
if(v2 === 0)
    v2 = v2.toString();
// the rest of your logic here

您也可以将其提取到方法中,因此不要重复代码。