我有以下数组和排序结果:
['53-15-9', '53-15-10', '53-15-8'].sort() // => ["53-15-10", "53-15-8", "53-15-9"]
但我需要得到以下结果:
["53-15-8", "53-15-9", "53-15-10"];
我怎样才能得到理想的结果?
答案 0 :(得分:4)
要比较数字而不是字符串,请先删除'-'
。当你使用算术
操作,JavaScript首先将其转换为数字。
'53-15-9'.replace(/-/g,'')
给出'53159'
。您可以使用sort()
中的闭包来传递比较函数,该函数可以简单地从b中减去a。以下函数将对数组进行升序排序:
['53-15-9', '53-15-10', '53-15-8'].sort(function(a,b){
return a.replace(/-/g,'') - b.replace(/-/g,'')
})
正如评论中所述,'54-1-1'
小于'53-15-9'
。我们可以将'54-1-1'
更改为'54-01-01'
。这仅适用于两位数。我们可以这样做:
function customSort(myArray) {
myArray = myArray.map(function(a,b){
var ar = a.split('-');
return ar.map(function(arK, arV){return (arK<10)?'0'+arK : arK.toString();}).join('-');;
})
return myArray.sort(function(a,b){
return a.replace(/-/g,'') - b.replace(/-/g,'')
});
}
customSort(['54-1-2','53-15-9', '53-15-10', '53-15-8']);
// => ["53-15-08", "53-15-09", "53-15-10", "54-01-02"]
答案 1 :(得分:0)
您可以使用自定义功能对零件进行拆分和分类。
var array = ['53-15-9', '53-15-10', '53-15-8'];
array.sort(function (a, b) {
var aa = a.split('-'),
bb = b.split('-'),
i, r = 0, l = Math.max(aa.length, bb.length);
for (i = 0; !r && i < l; i++) {
r = (aa[i] || 0) - (bb[i] || 0);
}
return r;
});
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');
答案 2 :(得分:0)
您需要定义自己的自定义排序功能。这是一个例子:
['53-15-9', '53-15-10', '53-15-8','2', '53-14-4','53-15-99'].sort(function(a,b){ // a and b are elements of the array
// split by - and convert values to number
a = a.split('-').map(function(val){return Number(val)})
b = b.split('-').map(function(val){return Number(val)})
// if one has less elements than another, we consider it should go first
if(a.length != b.length) return a.length > b.length
//else, one goes after another if one of its elements is greater than the others at that index
return a.some(function(val, index){
return val > b[index]
}) == 0 ? -1 : 1
})
//output: ["2", "53-14-4", "53-15-8", "53-15-9", "53-15-10", "53-15-99"]
答案 3 :(得分:0)
['53-15-9', '53-15-10', '53-15-8'].sort(function(a, b) {
var aNum = parseInt(a.replace(/-/g, ''));
var bNum = parseInt(b.replace(/-/g, ''));
return aNum < bNum ? -1 : aNum > bNum ? 1 : 0;
});
假设您想按数字顺序对它们进行排序,包括所有部分,只需删除-
,将它们解析为int,然后在自定义排序函数中对int进行排序。
答案 4 :(得分:0)
var arr = ['53-15-9', '53-15-10', '53-15-8'];
arr.sort(function(a,b){ return a.replace(/-/g,'') - b.replace(/-/g,'') });
console.log(arr);
输出
["53-15-8", "53-15-9", "53-15-10"]
答案 5 :(得分:0)
尝试使用-
Array.prototype.every()
分隔的每个数字
var arr = ["53-15-8", "53-15-9", "53-15-10"];
arr.sort(function(a, b) {
var curr = a.split(/-/).map(Number);
var next = b.split(/-/).map(Number);
return curr.every(function(val, key) {return val <= next[key]}) ? a : b
});
console.log(JSON.stringify(arr))