Ext.util.MixedCollection-->排序,克隆,过滤
2012-02-07 21:35 尔 阅读(245) 评论(0) 收藏 举报key排序和sort排序都是调用内部的_sort函数
property参数是用来判断是排序key还是value的标识
_sort : function(property, dir, fn){
var i, len,
dsc = String(dir).toUpperCase() == 'DESC' ? -1 : 1,
//弄一个数组c,以便能使用js原生的sort函数
c = [],
keys = this.keys,
items = this.items;
//默认的排序函数,很显然只能排序 asc||字符
fn = fn || function(a, b) {
return a - b;
};
//copy all the items into a temporary array, which we will sort
for(i = 0, len = items.length; i < len; i++){
//数组里的元素存放的是{},{}里复制了一套key和item和索引位置
c[c.length] = {
key : keys[i],
value: items[i],
index: i
};
}
//简单的原生数组排序
c.sort(function(a, b){
var v = fn(a[property], b[property]) * dsc;
//排序的值相同,就比较索引,索引靠前的排序后的位置靠前
if(v === 0){
v = (a.index < b.index ? -1 : 1);
}
return v;
});
浅克隆,如果复制的是对象那么复制的是引用。
clone : function(){
var r = new Ext.util.MixedCollection();
var k = this.keys, it = this.items;
for(var i = 0, len = it.length; i < len; i++){
r.add(k[i], it[i]);
}
r.getKey = this.getKey;
return r;
}如果实现对象的深克隆,可以先Ext.encode再Ext.decode,和java的序列化反序列话实现深克隆一样道理
Ext.util.MixedCollection提供了2种过滤方式,一种是基于正则表达式的,一种是基于使用者传入的过滤函数的(这个函数需要返回boolean,true留下,false过滤掉)
基于正则表达式的
构建正则表达式的工具函数
根据传入的第一个参数(我们应该为其传入字符串),和其他配置项,构建一个正则表达式
createValueMatcher : function(value, anyMatch, caseSensitive, exactMatch) {
if (!value.exec) { // not a regex
var er = Ext.escapeRe;
value = String(value);
//全局匹配
if (anyMatch === true) {
value = er(value);
} else {
value = '^' + er(value);
//精准匹配,匹配的必定是一个单词 (^ $)开头结尾
if (exactMatch === true) {
value += '; } } //构建正则表达式 value = new RegExp(value, caseSensitive ? '' : 'i'); } return value; },
filter,filterBy返回的是一个原Ext.util.MixedCollection对象过滤后的副本
浙公网安备 33010602011771号