2017-02-04 7 views
1

Так что мне интересно, что не так с моим кодом, который получает сортировку с аргументом сравнения, возвращает правильный порядок для всех чисел, но 5. У меня есть чувство, что это имеет какое-то отношение к тому, как я отключен цифры 12, 4, 94 и 1, но я полный новичок и довольно смущен. Заранее спасибо!Функция сортировки сортировки по Javascript Array

<!DOCTYPE html> 
<html> 
<head> 
    <title>Array Manipulation:Sort</title> 
    <script type="text/javascript"> 

     var parts = []; 

     parts.push("5", "42", "12"); 

     var removed = parts.pop(); 

     alert(removed); 


     function compare(value1, value2) { 
      if (value1 < value2) { 
       return -1; 
      } else if (value1 > value2) { 
       return 1; 
      } else { 
       return 0; 
      } 
     } 

     parts.unshift(12, 4, 94, 1); 

     alert(parts.sort());   //1, 12, 4, 42, 5, 94 
     alert(parts.sort(compare));  //1, 4, 12, 42, 5, 94 


    </script> 
</head> 
</html> 
+3

Я думаю, потому что вы смешиваете строки и числа. – Josh

+1

Некоторые из ваших элементов массива - это числа, некоторые из которых являются строками. Это не работает. Вы хотите сравнить их по числовому значению или по лексическим символам? – Bergi

+0

См. Также [Как правильно отсортировать массив целых чисел] (http://stackoverflow.com/q/1063007/1048572) - не знаете, каков ваш вопрос, может быть, это дубликат? – Bergi

ответ

0

Предлагаю рассматривать все значения как число и возвращать дельта с неявным типом приведения к числу.

function compare(value1, value2) { 
    return value1 - value2; 
} 

function compare(value1, value2) { 
 
    return value1 - value2; 
 
} 
 

 
var data = [12, 4, 94, 1, "5", "42"]; 
 

 
data.sort(compare); 
 

 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

Возможно, вы захотите упомянуть, что использование '-' неявно бросает их – Bergi

+0

Спасибо за объяснение Bergi; делают ли какие-либо операторы неявно литые переменные как тип номера? –

+0

в основном все [Арифметические операторы] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators) конвертировать в число, но не плюс, потому что, если какой-либо операнд является строкой, в результате получается строка. –

0

Изменить этот

var parts = []; 
parts.push("5", "42", "12"); 

в

var parts = []; 
parts.push(5, 42, 12); 

Так что вы можете сравнить только цифры и для сравнения:

function compare(value1, value2) { 
    return value1 - value2; 
} 
0

Если сравнить строку с номером , он преобразует оба в numbe rs, ищет первый символ, который отличается, а затем действует на основе этого.

"5" > "42" 

Явно конвертируйте ваши строки в числа, чтобы исправить это.

function compare(value1, value2) { 
     value1 = +value1; 
     value2 = +value2; 
+0

javascript не безопасен по типу, поэтому вам нужно обратить внимание при сравнении значений. см. ответ Квентина. –

+1

@ el_buck0 расскажите об этом OP, а не quentin –

+0

Прошу прощения. Я, конечно, не собирался ему говорить –

 Смежные вопросы

  • Нет связанных вопросов^_^