Почему не рукоположен array правильно в Safari?

Я считаю array объектов этим (упрощенным):

var datos = [
  { "nombre": "Prueba C", "valor":  1.5 },
  { "nombre": "Prueba A", "valor":  2.5 },
  { "nombre": "Prueba B", "valor":  4   }
];

Будь упорядочен стоимостью (C, A, B), но я хочу упорядочить элементы по имени (В, B, C). Для этого я использую sort с функцией собственного сравнения для такого имени:

function(a, b) { 
  return a.nombre > b.nombre; 
}

Распорядок функционирует без проблем в Chrome, IE и Firefox на рабочем столе, но когда он работает в Safari в iOS, array не рукоположен и остается таким каков есть. sort это родная функция языка сценариев JavaScript: почему он не удается в Safari? И как я могу решать это?

Здесь я оставляю минимальный, полный и проверяемый пример, который показывает проблему (Также в JSFiddle):

var datos = [
  { "nombre": "Prueba C", "valor":  1.5 },
  { "nombre": "Prueba A", "valor":  2.5 },
  { "nombre": "Prueba B", "valor":  4   }
];

datos.sort(function(a, b) { 
  return a.nombre > b.nombre; 
});

console.log(JSON.stringify(datos));
3
задан 15.01.2017, 21:18
0 ответов

Согласно документации ты должен использовать - функция, чтобы упорядочивать strings:

var datos = [
      { "nombre": "Prueba C", "valor":  1.5 },
      { "nombre": "Prueba A", "valor":  2.5 },
      { "nombre": "Prueba B", "valor":  4   }
    ];

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

    alert(JSON.stringify(datos));

Почему он не удается только в Safari?:

Array.prototype.sort() он не надеется, что ты возвращаешь ему стоимость booleanos (true/false) или cadenas (string), подожди скорее стоимость entero (integer), будьте отрицательным, нуль или позитив.

После, каждый браузер использует различный алгоритм для Array.prototype.sort():

Спецификации ECMAScript, он не регулирует, какой алгоритм они должны использовать каждый из браузеров.

Информация: В мобильном телефоне (iPhone) использует Chrome механизм Safari и у тебя был бы тот же результат как в браузере Safari, если ты не используешь функцию сравнения.

4
ответ дан 03.12.2019, 17:40
  • 1
    Тогда кажется, что идея - что funció n comparació n будь должен возвращать целую стоимость вместо booleano. –  16.01.2017, 15:48
  • 2
    @AlvaroMontoro - Точный... Я издал ответ –  16.01.2017, 16:55

Консультируйте тип возврата функции классификации массива здесь: https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Array/sort

var datos = [
  { "nombre": "Prueba C", "valor":  1.5 },
  { "nombre": "Prueba A", "valor":  2.5 },
  { "nombre": "Prueba B", "valor":  4   }
];

datos.sort(function(a, b) {
  if (a.nombre > b.nombre) {
    return 1;
  }
  if (a.nombre < b.nombre) {
    return -1;
  }
  // a == b
  return 0;
});

console.log(JSON.stringify(datos));
2
ответ дан 03.12.2019, 17:40

Теги

Похожие вопросы