2015-05-29 2 views
1

Если у меня есть массив, как:Javascript сортировки() массив смешанного типа данных

["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

Используйте вот-тире или знак подчеркивания :) –

+1

Спасибо за комментарий вы могли бы указать на определенную функцию, пожалуйста? –

+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: затем сравнить числа, если первый comparaison не хватает

Более углубленно: +a преобразует a в число. Он равен (для ==, а не for ===) до a тогда и только тогда, когда +a является номером (помните, NaN не равно NaN).

+0

может у вас добавить некоторое объяснение для кода, который вы отправили? – Alex

+0

@ Алекс теперь ясно? –

+0

можно u пожалуйста, входить немного подробности. а не против избирателей – Alex

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); 
Смежные вопросы