Array.sort在Nativescript iOS上无法正常运行,用于具有大量数字的超大型阵列

时间:2019-01-23 19:59:17

标签: typescript sorting nativescript

因为我使用的是Nativescript,所以我为Android和iOS使用相同的Typescript代码。

我有大约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 :(得分:1)

请看看这个:

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来解决它...¯__(ツ)_ /¯