如果我有一个类似的数组:
["23", "765", "sfasf", "2.3E-3", "2.3cE-3"]
如何订购,以便数字(小数,浮点数或科学记数法)按升序排序,并且在那些不是数字的字符串之后排序(例如" sfasf"或" 2.3cE -3"?)
示例数组的预期顺序:
["2.3E-3", "23", "765", "2.3cE-3", "sfasf"]
无法转换为数字的字符串顺序并不重要,它们只是必须在最后。
答案解答:
$scope.cleanAndOrder = function(dbo, fieldName) {
var textareaId = "textarea"+"_"+fieldName ;
var textarea= document.getElementById(textareaId);
//(+b && (+a!=a)) : return true (converted to 1) if b is a number and a isn't
//(a-b) : then compare the numbers if the first comparaison isn't enough
textarea.value = dbo.attributes[fieldName].sort(function(a,b){ return (+b && !+a) || (a-b) }).join("\n");
var lines = textarea.value.split("\n");
textarea.setAttribute('rows', lines.length +2);
}
答案 0 :(得分:5)
你可以做到
var arr = arr.sort(function(a,b){ return ((+b==b) && (+a!=a)) || (a-b) })
这个想法是进行两次比较:
(+b==b) && (+a!=a)
:如果true
是一个数字且1
不是b
(转换为a
)
a-b
:如果第一个比较法不够,则比较数字更深入:+a
将a
转换为数字。当且仅当==
是一个数字时(for ===
不等于{a
,+a
与NaN
相等(NaN
,而不是 var obj = { pageSize:"25",asOfDate:"Thu Sep 25 00:00:00 UTC+0530 2014"};
obj.asOfDate = reverseUTC(obj.asOfDate);
var d = JSON.stringify(obj);
function reverseUTC(updatedDate) {
if ($.isEmptyObject(updatedDate)) {
var offset = updatedDate.getTimezoneOffset();
var currentDateTime = new Date();
updatedDate.setHours((currentDateTime.getHours() * 60 + currentDateTime.getMinutes() - offset) / 60);
updatedDate.setMinutes((currentDateTime.getHours() * 60 + currentDateTime.getMinutes() - offset) % 60);
return updatedDate;
}
}
} {1}})。
答案 1 :(得分:0)
sort
函数接受函数comparaison作为参数。
定义你的
function compareFct(a, b) {
if (isNaN(a)) {
if (isNaN(b)) { // a and b are strings
return a.localeCompare(b);
} else { // a string and b number
return 1; // a > b
}
} else {
if (isNaN(b)) { // a number and b string
return -1; // a < b
} else { // a and b are numbers
return parseFloat(a) - parseFloat(b);
}
}
}
并像
一样使用它yourArray.sort(compareFct);