Как сортировать массив с неопределенными элементами в IE7 JavaScript

StackOverflow https://stackoverflow.com/questions/2880221

  •  04-10-2019
  •  | 
  •  

Вопрос

У меня проблемы с сортировкой массива, который включает неопределенные элементы (редкий массив) в IE7. Это отлично работает в Safari и Firefox, конечно, и я не пробовал другие версии IE, но вот простой пример.

<html>
<head>
<script type="text/javascript">
function runscript() {
    var myArray = [{id: 2},
                        undefined,
                        {id: 0},
                        {id: 1},
                        {id: 3},
                        {id: 4},
                        {id: 5}];
    myArray.sort(function compare(a, b) { return a.id - b.id; });
    var output = '';
    for (loop in myArray) {
        output += myArray[loop].id + ' ';
    }
    alert(output);
}
</script>
</head>
<body onLoad="runscript();">
</body>

Alert () в конце необъяснимо показывает 0 2 3 4 5 1. Удаление неопределенного элемента из массива правильно сортирует его и предупреждение показывает 0 1 2 3 4 5.

Есть ли способ работать вокруг этого в IE7, чтобы я мог надежно сортировать массивы, которые включают неопределенные элементы? Мне все равно, когда неопределенные элементы в конечном итоге в конце концов, поскольку определенные элементы сортируются правильно.

Это было полезно?

Решение

Попробуйте изменять for (loop in myArray) к for (var loop=0; loop<myArray.length; loop++):

function runscript() {
    var myArray = [{id: 2},
                        undefined,
                        {id: 0},
                        {id: 1},
                        {id: 3},
                        {id: 4},
                        {id: 5}];
    myArray.sort(function compare(a, b) { return a.id - b.id; });
    var output = '';
    for (var loop=0; loop<myArray.length; loop++) {
        output += (myArray[loop]||{id: 'undefined'}).id + ' ';
    }
    alert(output);
}
runscript()

при использовании for (x in object) Предметы не гарантируются в порядке. Смотрите также Почему используют «для ... в» с массивом итерацией плохой идеей?

(Вышеперечисленные оповещения 0 1 2 3 4 5 undefined)

РЕДАКТИРОВАТЬ: Воспитанный - я испытал вышеперечисленное и работает :-P

Другие советы

Может быть, вы можете изменить свой компаратор

myArray.sort(function compare(a, b) { return a.id || 0 - b.id || 0; });

Прежде всего, ваша функция сортировки неверна, как ожидается, вернет -1, 0 или +1, не логическое значение.
Используйте это вместо этого

var arr = [.....]
arr.sort((function(a, b){
    if (!a || !b) {
        // Here you choose how to treat undefined/null elements
        return 0;
    }  
    return (a[index].id === b[index].id ? 0 : (a[index].id < b[index].id ? -1 : 1));
})

Но просто так, чтобы вы знали, эта петля твоего собирается бросить ошибку при попытке вернуть id Собственность от неопределенного элемента. Кроме того, вы никогда не должны использовать for..in петля для перевозок на массиве, используйте либо цикл с увеличением индекса или обратное во время этого

var l = arr.length; 
while (l--) {
    ..
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top