Javascript sort()数组混合数据类型

时间:2015-05-29 11:33:11

标签: javascript arrays sorting

如果我有一个类似的数组:

["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);
 }

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:如果第一个比较法不够,则比较数字

更深入:+aa转换为数字。当且仅当==是一个数字时(for ===不等于{a+aNaN相等(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);