使用int的第一个和第二个字符串对int和string排序对象值

时间:2015-07-09 20:35:45

标签: javascript jquery

var table = 
    [
        {"name":"Joe", "Level":1}, 
        {"name":"Bob", "Level":1B}, 
        {"name":"Carl", "Level": 7},
        {"name":"Mike", "Level": 1A},
        {"name":"Sal", "Level": 2}
    ]
var tableHeaders = scope.SortTableColumnHeaders(table)

scope.SortTableColumnHeaders = function (array) {
        var unique = {};
        var distinct = [];
        for (var i in array) {
            if (typeof (unique[array[i].Level]) == "undefined") {
                distinct.push(array[i].Level);
            }
            unique[array[i].Level] = 0;
        }
        return distinct.sort();
    };

我有一个看起来像上面代码的对象,我拿出一个不同的数组 [1,10,1A,1B,2,7] 我可以有int(1-10)和字符串(1A,1B,1C)

我想先按顺序对int进行排序,然后对第二顺序进行排序,这样总会看起来像 [1 ... 10,1A,1B,1C]

我尝试了distinct.sort(),但这不起作用。

3 个答案:

答案 0 :(得分:0)

嗯,ASCII值是连续的,数字低于字母表中的字符数,所以如果你可以使用ASCII值的总和(可以使用1A1B等等上)

var table = [
   {"name":"Joe", "Level": '1'}, 
   {"name":"Bob", "Level": '1B'}, 
   {"name":"Carl", "Level": '7'},
   ...
]

function sortByCharCode(a,b) {
    function charCodeInt(s) {
        result = 0;
        for (var i=0;i<s.length;i++) {
            result += s.charCodeAt(i);
        }
        return result;
    } 
    a = charCodeInt(a.Level);
    b = charCodeInt(b.Level);
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
}

$scope.sortTable = function() {
   $scope.table.sort(sortByCharCode);
}

答案 1 :(得分:-1)

一种方法是明确枚举您的排序:

var definedSort = [1,2,3,4,5,6,7,8,9,10,'1A','1B','1C'];
var someArray = ['1A', 4, 8, 5, 1, 9, '1C', '1B'];
    
someArray.sort(function(a,b) {
    return definedSort.indexOf(a) - definedSort.indexOf(b);
});
    
alert(someArray);

但是,考虑到您的简单限制,您还可以采用更复杂的方式实施它:

var someArray = ['1A', 4, 8, 5, 1, 9, '1C', '1B'];

someArray.sort(function(a,b) {
  return (a - b) || -a || +b || (a > b)
});

alert(someArray);

答案 2 :(得分:-1)

你仍然可以使用sort方法,传递一个函数来驱动你的标准:

table.sort(function(a, b){
    var compA = a.Level;
    var compB = b.Level;
    if(isNaN(compA) && isNaN(compB)){
        return compA.localeCompare(compB);
    } else if(isNaN(compA)){
        return 1;
    } else if(isNaN(compB)){
        return -1;
    } else {
        return compA - compB;
    }
});

在此排序中,您将对它们之间的数字进行排序,对于字符串(1A,1B ......)进行排序。当两者一起排序时,数字首先出现。