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

Al *_*Tsm 1 javascript arrays sorting

如果我有一个像这样的数组:

["23", "765", "sfasf", "2.3E-3", "2.3cE-3"]
Run Code Online (Sandbox Code Playgroud)

如何订购,以便数字(小数,浮点数或科学记数法)按升序排序,并且在那些不是数字的字符串之后(例如"sfasf"或"2.3cE-3")?

示例数组的预期顺序:

["2.3E-3", "23", "765", "2.3cE-3", "sfasf"]
Run Code Online (Sandbox Code Playgroud)

无法转换为数字的字符串的顺序无关紧要,它们必须在最后.

答案解答:

 $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);
 }
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 5

你可以做

var arr = arr.sort(function(a,b){ return ((+b==b) && (+a!=a)) || (a-b) })
Run Code Online (Sandbox Code Playgroud)

这个想法是进行两个比较:

  • (+b==b) && (+a!=a):return true(转换为1)if b是一个数字而a不是
  • a-b :如果第一个比较法不够,那么比较数字

更深入:+a转换a为数字.它是等于(for ==,not for ===)awhen when和only when +a是一个数字(记住,NaN不等于NaN).