Array.sort работает некорректно на Nativescript iOS для очень больших массивов с большими числами - PullRequest
0 голосов
/ 23 января 2019

Поскольку я использую Nativescript, я использую один и тот же код Typescript для Android и iOS.

У меня очень большой набор данных, состоящий из 1000-2000 (может быть больше) объектов с очень большими значениями данных в массиве.

const unsorted = [
    ...,
    {
        name: "name1",
        value: 10000000
    },{
        name: "name120",
        value: 200000000
    },{
        name: "name42",
        value: 3
    },{
        name: "name1203",
        value: 1000000000000
    },
    ...
];

const sorted = unsorted.sort((a,b) => (b.value-a.value));

На Android sorted всегда правильно сортируется, а iOS - нет. Массивы iOS возвращают «наполовину отсортированные» - первые десять или двадцать отсортированы правильно, но затем случайным образом имеют неправильно отсортированные значения, как в моем примере ниже:

[...1003, 26, 1002, 1001, ..., 20, 19, 14, 18, 17, 16, 15, 13, 12, 11, 10]

Я обнаружил, что могу получить одинаковые данные на Android и iOS, если сделаю что-то грязное, например:

const secondSort = sorted.sort((a,b) => (b.value-a.value));
const thirdSort = secondSort.sort((a,b) => (b.value-a.value));
const fourthSort = thirdSort.sort((a,b) => (b.value-a.value));

Так что может показаться, что первая сортировка фактически не сортирует мой большой набор данных полностью.

Кто-нибудь еще видел такое поведение? Или, может быть, это можно сделать методом грубой силы, чтобы мне не нужно было объединять несколько функций сортировки?

1 Ответ

0 голосов
/ 23 января 2019

Пожалуйста, посмотрите на это:

https://stackoverflow.com/a/15507922

Кажется, WebKit (который использует NativeScript, так же, как Safari) не очень хорошо работает с этим видом сортировки, так что вы можетеполучить лучший результат, выполнив:

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

Мы уже сталкивались с чем-то вроде этого.В нашем случае это был объект Date, который имел неправильный часовой пояс после того, как вы изменили его, и мы должны были использовать moment.js для его решения ... ¯ \ _ (ツ) _ / ¯

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