Javascript - проблема с функцией сортировки в Opera 11.60 и IE 8 - PullRequest
0 голосов
/ 07 января 2012

Я пытаюсь отсортировать объекты по свойствам. У меня проблема с Opera и IE с моей функцией. До сих пор я отлаживал проблему в Opera на этом этапе:

  1. Откройте «Opera browser» и нажмите cntr + shift + i. Выберите консоль.
  2. Передайте этот код в консоли и нажмите shift + enter.

    var DataArray=["Other","Attitude","Attitude","Delivery/timings","General   Performance","Personal Planning","Other"]
    DataArray=DataArray.sort(function(a,b)
    {
        return a<b;
     });
    
    JSON.stringify(DataArray);
    

Вы должны получить правильный результат, подобный этому:

[«Персональное планирование», «Другое», «Другое», «Общая производительность», «Доставка / сроки», «Отношение», «Отношение»]

  1. Теперь измените функцию сортировки следующим образом a> b и нажмите enter + shift, чтобы выполнить ее.

    var DataArray=["Other","Attitude","Attitude","Delivery/timings","General   Performance","Personal Planning","Other"]
    DataArray=DataArray.sort(function(a,b)
    {
        return a>b;
    });
    JSON.stringify(DataArray);
    

Мой результат:

[«Отношение», «Доставка / сроки», «Отношение», «Общая производительность», «Другое», «Другое», «Персональное планирование»]

Обратите внимание на первое, второе и третье значение? Что происходит?

Если вы выполните это в консоли "Attitude" = "Attitude", она вернет true ...

Есть идеи?

Заранее спасибо.

EDIT: И часть с IE:

КОД:

 var DataArray=['Other','Attitude','Attitude','Delivery/timings','General    Performance','Personal Planning','Other'];

 DataArray=DataArray.sort(function(a,b)
{
     return a<b;
 });

prompt('',DataArray);

Результат (правильный): Личное планирование, Другое, Другое, Общая эффективность, Отношение, Отношение, Доставка / Сроки

КОД:

var DataArray = ['Other', 'Attitude', 'Attitude', 'Delivery / timeings', 'General Performance', 'Personal Planning', 'Other'];

    DataArray=DataArray.sort(function(a,b)
    {
        return a>b;
    });

    prompt('',DataArray);

РЕЗУЛЬТАТ (неверно): Отношение, Отношение, Другое, Доставка / сроки, Общая производительность, Другое, Персональное планирование

РЕШЕНИЕ:

sortableArray=sortableArray.sort(function(a,b)
                {
                    if(a.Category>b.Category)
                    {
                        return 1;
                    }

                    if(a.Category<b.Category)
                    {
                        return -1;
                    }

                    return 0;

                });

Для сортировки данных по убыванию используйте функцию reverse ().

Спасибо за помощь. Особенно для @ nnnnnn

Ответы [ 2 ]

5 голосов
/ 07 января 2012

Это не проблема с каким-либо конкретным браузером, это проблема с тем, что вы не прочитали .sort() документацию по функциям .Обратный вызов, который вы передаете .sort(), не должен возвращать логическое значение, он должен возвращать число:

  • отрицательно, если a предшествует b
  • 0, если aравно b
  • положительно, если a следует после b
4 голосов
/ 07 января 2012

Ваша функция сортировки возвращает логическое значение, в то время как она должна возвращать целое число. Хотя 1 можно спутать как true и 0 как false, это не должно быть чем-то, на что вы полагаетесь в своей логике кода. Функция должна иметь 3 случая возврата:

  • < 0 если a > b
  • > 0, если a < b
  • == 0, если a == b

Так что вы должны использовать сортировку вашего массива так:

  DataArray = DataArray.sort(function(a,b){
      return a>b ? 1 : a<b ? -1 : 0;          
  });

Вот рабочая демонстрация .

...