Функция сортировки JavaScript В Mozilla Firefox вывод отличается от Google Chrome - PullRequest
0 голосов
/ 03 апреля 2019

Ну, у меня есть массив JavaScript объектов, как показано ниже.

players = [{"player": "CR7", "status": false, "fullname": "Cristiano Ronaldo"},
 {"player": "NJR11", "status": false, "fullname": "Neymar Jr."},
 {"player": "SC11", "status": false, "fullname": "Sunil Chhetri"},
 {"player": "LM10", "status": true, "fullname": "Lionel Messi"},
 {"player": "SG19", "status": false, "fullname": "Sergio Aguero"}
];

Также я использовал метод ниже для сортировки массива.Мой предполагаемый результат - что-то вроде объекта со статусом: true должен стоять первым, а остальные объекты сохраняют порядок.

players.sort((p) => (p.status) ? -1 : 1);

В Google Chrome он работает нормально, как показано ниже.

         [{"player":"LM10","status":true,"fullname":"Lionel Messi"},
          {"player":"CR7","status":false,"fullname":"Cristiano Ronaldo"},
          {"player":"NJR11","status":false,"fullname":"Neymar Jr."},
          {"player":"SC11","status":false,"fullname":"Sunil Chhetri"},
          {"player":"SG19","status":false,"fullname":"Sergio Aguero"}
         ]

Но в Mozilla Firefox и в браузере Android по умолчанию это происходит, как показано ниже, что НЕ Я хотел.

        [{"player":"LM10","status":true,"fullname":"Lionel Messi"},
         {"player":"SG19","status":false,"fullname":"Sergio Aguero"},
         {"player":"SC11","status":false,"fullname":"Sunil Chhetri"},
         {"player":"NJR11","status":false,"fullname":"Neymar Jr."},
         {"player":"CR7","status":false,"fullname":"Cristiano Ronaldo"}
         ]

Почему в Firefox он ведет себя по-другому, и как это работает, как в Chrome ??

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

При использовании логических значений вам необходимо выполнить сортировку в обратном порядке, поскольку true интерпретируется как 1, а false равно нулю.

Для получения true значений сначала вам нужно вычесть b из a.

var players = [{ player: "CR7", status: false, fullname: "Cristiano Ronaldo" }, { player: "NJR11", status: false, fullname: "Neymar Jr." }, { player: "SC11", status: false, fullname: "Sunil Chhetri" }, { player: "LM10", status: true, fullname: "Lionel Messi" }, { player: "SG19", status: false, fullname: "Sergio Aguero" }];

players.sort((a, b) => b.status - a.status); true frist

console.log(players);

Другое решение - обратный вызов, который вы предоставили.

var players = [{ player: "CR7", status: false, fullname: "Cristiano Ronaldo" }, { player: "NJR11", status: false, fullname: "Neymar Jr." }, { player: "SC11", status: false, fullname: "Sunil Chhetri" }, { player: "LM10", status: true, fullname: "Lionel Messi" }, { player: "SG19", status: false, fullname: "Sergio Aguero" }],
    sortBy = p => p.status ? -1 : 1; // true first

players.sort((a, b) => sortBy(a) - sortBy(b));

console.log(players);
1 голос
/ 03 апреля 2019

Вы в основном тасуете массив. Он перетасовывает то, как вы ожидаете, что он сортируется в Chrome случайно Ваша сортировка не работает вообще. sort в конце концов принимает два элемента, которые вы должны сравнить:

players.sort((a, b) => b.status - a.status);

Это краткая форма:

players.sort((a, b) => {
  if(a.status === b.status) return 0; // order doesnt matter
  if(a.status) return -1; // only a has status, comes first
  if(b.status) return 1 // only b has status, comes first
});

В качестве альтернативы:

 players = [...players.filter(it => it.status), ...players.filter(it => !it.status)];

может быть быстрее в зависимости от алгоритма сортировки, используемого двигателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...