簡體   English   中英

Javascript按數字排序,而不是按字母排序

[英]Javascript sort numerically instead of alphabetically

我有一個功能可以按字母順序對行進行排序,並且效果很好,但是如果它包含數字,它將對它進行排序a1,a10,a11,...,a2,a20,...,a3而不是a1,a2,a3等。

function sort(element) {
 var sortableList = element;
 var listitems = $('tr', sortableList);

 listitems.sort(function (a, b) {

     return ($(a).find('td.myclass').text().toUpperCase() > $(b).find('td.myclass').text().toUpperCase()) ? 1 : -1;
 });
 sortableList.append(listitems);

}

嘗試使用此代碼形成下面的示例。 尚無法使用:

function sort(element) {
 var sortableList = element;
 var listitems = $('tr', sortableList);
 var word = /[a-z]/i,
    digit = /\d+/;

listitems.sort(function (a, b) {
   return +$(a).find('td.myclass').text().match(digit)[0] > +$(b).find('td.myclass').text().match(digit)[0] ? 1 : -1;
}).sort(function (a, b) {
   return $(a).find('td.myclass').text().match(word)[0] > $(b).find('td.myclass').text().match(word)[0] ? 1 : -1;
});
 sortableList.append(listitems);

}

錯誤: null is not an object (evaluating '$(b).find('td.myclass').text().match(digit)[0]')

我認為這應該如預期的那樣工作,而不管文本的復雜性...

 function sort(sortableList) { $(sortableList).append([].slice.call($('tr', sortableList)).map(function (e) { return { element: e, values: ($(e).find('td').text().toUpperCase() || '').match(/([AZ]+|\\d+)/g) }; }).sort(function (aa, bb) { var valuesA = aa.values ||[]; var valuesB = bb.values ||[]; var len = Math.min(valuesA.length, valuesB.length); for (var i = 0; i < len; i++) { var a = valuesA[i]; var b = valuesB[i]; if (a === b) { continue; } var aIsNum = !isNaN(parseInt(a)); var bIsNum = !isNaN(parseInt(b)); if (aIsNum && bIsNum) { return parseInt(a) - parseInt(b); } if (!(aIsNum && bIsNum)) { return a > b ? 1 : -1; } if (aIsNum) { return -1; } return 1; } return valuesA.length - valuesB.length; }).map(function (e) { return e.element; })); document.getElementById('msg').textContent = 'Sorted'; } setTimeout(function () { return sort(document.querySelector('table')); }, 2000); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <span id="msg">Wait for it ....</span> <table> <tr> <td>a100</td> </tr> <tr> <td>a10</td> </tr> <tr> <td>b100</td> </tr> <tr> <td>a20</td> </tr> <tr> <td>a1</td> </tr> <tr> <td>a2</td> </tr> <tr> <td style="background:red"></td> </tr> <tr> <td>5</td> </tr> <tr> <td>a</td> </tr> <tr> <td>b1</td> </tr> </table> 

嘗試這個

 "use strict"; let myArr = ['a1', 'c', 'c56','a', 'ac2', 'ab21', 1, '5a', 6, 'A16', 'b', 3, 'a3', 'abc']; let result = []; function compareNumeric(a, b) { return parseInt(a) - parseInt(b); } function compareStr(a, b) { return a.toUpperCase() > b.toUpperCase(); } function compareStrNum(a, b) { if (a.match(/[az]+/i)[0].toUpperCase() === b.match(/[az]+/i)[0].toUpperCase()) { if (a.match(/\\d+/) === null) { return 0; } return +a.match(/\\d+/)[0] - +b.match(/\\d+/)[0]; } } function compare(arr) { let numeric = []; let str = []; for (let i = 0, max = arr.length; i < max; i++) { if (parseInt(arr[i])) { numeric.push(arr[i]); } else { str.push(arr[i]); } } numeric = numeric.sort(compareNumeric); str.sort(compareStr) .sort(compareStrNum); result = result.concat(numeric); result = result.concat(str); } compare(myArr); console.log(result); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM