【问题标题】:Array.sort not working correctly on Nativescript iOS for very large arrays with large numbers对于具有大量数字的非常大的数组,Array.sort 在 Nativescript iOS 上无法正常工作
【发布时间】:2019-01-24 04:24:03
【问题描述】:

因为我使用的是 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 数组返回“半排序”——前 10 或 20 个排序正确,但随后随机排序错误,类似于下面的示例:

[...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));

所以看起来第一个排序实际上并没有完全排序我的大型数据集。

还有其他人看到过这种行为吗?或者是否有一种蛮力的方式来确保我不需要将几个排序函数串在一起?

【问题讨论】:

  • 什么时候输出值?
  • 我不确定我是否遵循。我需要将变量sorted 从最大到最小排序,然后将sorted 变量用于ListView。像 Android 中的魅力一样工作。我肯定在 iOS 中得到了一个渲染的 ListView,但它没有正确排序。
  • sorted 是您直接在模板中绑定的实例级属性吗?
  • 是的。在 html 中,它看起来类似于 <ListView [items]="sorted"></ListView>

标签: typescript sorting nativescript


【解决方案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 来解决它...¯\_(ツ)_/¯

【讨论】:

  • 就是这样!谢谢!多么奇怪。现在要更新我使用错误排序的其他地方。
  • 很高兴它成功了!如果您遇到任何严格与 javascript 相关的行为问题,我建议您搜索 Safari/Webkit 而不仅仅是 Nativescript(或 Android 上的 Chrome/V8),因为它可能会产生更好的结果。也就是说,我们唯一遇到的其他问题是 Date,所以这些问题很少见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多