Javascript Array сортировать функции сравнения странный порядок

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

<!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 ответа

Решение

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

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; }

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

"5" > "42"

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

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

Изменить это

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

в

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

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

function compare(value1, value2) {
    return value1 - value2;
}
Другие вопросы по тегам