gpt4 book ai didi

javascript - 使用 Ext.util.Sortable 对数组进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 16:12:12 25 4
gpt4 key购买 nike

我想重用商店的排序器来创建比较函数来对数组进行排序。这是我简化的代码:

// Data to sort
var data = [
{rank: 2, name: 'Zebra'},
{rank: 2, name: 'Aardvark'},
{rank: 1, name: 'Lion'}
];

// Sort by rank, then by name, case-insensitive
var sorters = [
{property: 'rank'},
{property: 'name', transform: function(x) {return x.toLowerCase();}}
];

// Will need this
var util = Ext.create('Ext.util.Sortable');

// Normalize the sorters
var decoded = util.decodeSorters(sorters);

// Create a comparator
var comparator = util.createComparator(decoded);

// Sort the data using the comparator
// *** fails here in ExtJS 5 ***
Ext.Array.sort(data, comparator);

// Output
Ext.Msg.alert('Success', JSON.stringify(data));

在失败的地方,它表示 this.sorterFn 不是一个函数,位于排序相关函数的几层深处。确认上述内容在 ExtJS 6 中完美运行。

花了很长时间才达到这一点,所以在我深入了解较低级别之前,是否有更简单的方法来做到这一点?也就是说,重用用于数据存储的排序器来对数据进行排序?

或者,是否有我可以应用的补丁?

最佳答案

这是 ExtJS 5.1.1 及更早版本中的问题。将此覆盖添加为 Sortable.js,它修复了与范围相关的错误,即将 for 中的 this 替换为 sorters[i] 循环:

Ext.define('Ext.overrides.util.Sortable', { 
override: 'Ext.util.Sortable',
createComparator: function(sorters) {
return sorters && sorters.length ? function(r1, r2) {
var result = sorters[0].sort(r1, r2),
length = sorters.length,
i = 1;
for (; !result && i < length; i++) {
result = sorters[i].sort.call(sorters[i], r1, r2);
}
return result;
}: function() {
return 0;
};
}
});

在 ExtJS 5.0 和 5.1.0 中测试了您的代码,它可以正常工作。

关于javascript - 使用 Ext.util.Sortable 对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41370199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com