![](/img/trans.png)
[英]Trying to prevent invalid keypushes (not numbers) and multiple decimal points
[英]Sorting 'numbers' with multiple decimal points
我有一堆“數字”有多個小數點(所以它們真的是字符串)。 但是,我想對它們進行排序,好像它們是數字一樣。
1.1.1
10.2.3
2.6.7
21.10.4
3.10.12
4.11.5
4.1.16
6.4.23
我希望它們按第一組數字(在第一個小數點之前)排序,然后按第二組排序,然后按第三組排序(可能繼續第四組或更多)。 它們應按此順序排列:
1.1.1
2.6.7
3.10.12
4.1.16
4.11.5
6.4.23
10.2.3
21.10.4
使用JS執行此操作的最佳方法是什么? 我想我可能需要將每個數字分成一個數組,但也許有更好的方法。 想法?
我覺得這樣的事情可以解決問題:
nums.sort(function(a, b) {
var nums1 = a.split(".");
var nums2 = b.split(".");
for (var i = 0; i < nums1.length; i++) {
if (nums2[i]) { // assuming 5..2 is invalid
if (nums1[i] !== nums2[i]) {
return nums1[i] - nums2[i];
} // else continue
} else {
return 1; // no second number in b
}
}
return -1; // was missing case b.len > a.len
});
var nums = ['1.1.1', '2.6.7.3.2', '2.6.7', '2.6.7.3', '2.6.7.1', '6.4.23', '2.7']
這樣排序=> ['1.1.1','2.6.7.1','2.6.7.3.2','2.6.7','2.6.7.3','2.7','6.4.23']
為了取悅megawac:D
list.sort(function (a, b) {
var result;
a = a.split('.');
b = b.split('.');
while (a.length) {
if (result = a.shift() - (b.shift() || 0)) {
return result;
}
}
return -b.length;
});
處理任意數量的點:
input ['1.3', '10', '1.2', '2', '1.1.2', '1.1.1', '1.1']
output ['1.1', '1.1.1', '1.1.2', '1.2', '1.3', '2', '10']
試試這個 :
var list = ['1.1.1', '10.2.3', '2.6.7', '21.10.4', '3.10.12', '4.11.5', '4.1.16', '6.4.23'];
list.sort(function (a, b) {
a = a.split('.');
b = b.split('.');
return (
a.shift() - b.shift()
) || (
a.shift() - b.shift()
) || (
a.shift() - b.shift()
);
});
我通過將每個數字拆分成一個數組然后使用自定義排序方法執行多維排序來解決這個問題。 這是我得到的:
function multiDecimalSort(input) {
var output,
i,
len;
output = [];
// Unglue decimal parts
for (i = 0, len = input.length; i < len; i++) {
output.push(input[i].split('.'));
}
// Apply custom sort
output.sort(function (a, b) {
for (i = 0, len = a.length; i < len; i++) {
// cast decimal part to int
a[i] = parseInt(a[i], 10);
b[i] = parseInt(b[i], 10);
if (a[i] !== b[i]) {
return a[i] - b[i];
}
}
});
// Rejoin decimal parts
for (i = 0, len = input.length; i < len; i++) {
output[i] = output[i].join(".");
}
return output;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.