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

Using Ext.util.Sortable to sort an array

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

// 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 is not a function 在几层排序相关函数的深处。确认以上内容在 ExtJS 6 中完美运行。

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

进行排序

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

这是 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 中测试了您的代码,它可以正常工作。