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(),但这不起作用。
答案 0 :(得分:0)
嗯,ASCII值是连续的,数字低于字母表中的字符数,所以如果你可以使用ASCII值的总和(可以使用1A
,1B
等等上)
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 ......)进行排序。当两者一起排序时,数字首先出现。