// JavaScript Document
//Array 方法
(function(){
var arrayPrototype = Array.prototype,
slice = arrayPrototype.slice,
supportsSplice = (function(){ var array = [],lengthBefore,j = 20; if(!array.splice)
{
return false;
} while(j--)
{
array.push("A");
} array.splice(15, 0, "F", "F", "F", "F", "F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F","F"); //console.log(array); lengthBefore = array.length; array.splice(13,0,'XXX'); if(lengthBefore +1 !=array.length)
{
return false;
} return true; }()), supportsForEach='forEach' in arrayPrototype,
supportsMap='map' in arrayPrototype,
supportsIndexOf = 'indexOf' in arrayPrototype,
supportsEvery = 'every' in arrayPrototype,
supportsSome = 'some' in arrayPrototype,
supportsFilter = 'filter' in arrayPrototype,
supportsSort = (function(){
var a = [1,2,3,4,5].sort(function(){return 0;});
return a[0] ===1 && a[1]===2 && a[2]===3 && a[3]===4 && a[4]===5;
}()),
supportsSliceOnNodeList =true,
ExtArray,erase,replace,splice; try
{
if(typeof document !== 'undefined')
{
slice.call(document.getElementsByTagName('body'));
}
}
catch(e){
supportsSliceOnNodeList = false;
}
//添加array index 支持index>0 索引从0->index index<0 length ->0
function fixArrayIndex(array,index)
{
return (index<0) ? Math.max(0,array.length + index):Math.min(array.length,index);
} function replaceSim(array,index,removeCount,insert)
{
var add = insert ? insert.length :0,
length = array.length,pos=fixArrayIndex(array,index),
remove,tailOldPos,tailNewPos,tailCount,lengthAfterRemove,i; if(pos == length)
{
if(add)
{
array.push.apply(array,insert);
}
}
else
{
/*
0 1 2 3 4 5 6 7 8
replace(arr,3,2,[a,b,c])
*/
remove = Math.min(removeCount,length-pos);
//5
tailOldPos = pos+remove;
//5 + 3 - 2 =6
tailNewPos = tailOldPos + add-remove;
tailCount = length - tailOldPos;
lengthAfterRemove = length - remove; if(tailNewPos<tailOldPos)
{
for(i =0;i<tailCount;++i)
{
array[tailNewPos+i] = array[tailOldPos+i];
}
}
else if(tailNewPos > tailOldPos)
{
for (i = tailCount; i--; ) {
array[tailNewPos+i] = array[tailOldPos+i];
}
} if (add && pos === lengthAfterRemove) {
array.length = lengthAfterRemove; // truncate array
array.push.apply(array, insert);
} else {
array.length = lengthAfterRemove + add; // reserves space
for (i = 0; i < add; ++i) {
array[pos+i] = insert[i];
}
} } return array; } function replaceNative(array,index,removeCount,insert)
{
if(insert && insert.length)
{
if(index === 0 &&!removeCount)
{
array.unshift.apply(array,insert);
}
else if(index < array.length)
{
array.splice.apply(array,[index,removeCount].concat(insert));
}
else
{
array.push.apply(array,insert);
}
}
{
array.splice(index,removeCount);
} return array;
}
//var arr = [1,2,3,4,5,6];
// arr.splice(3,2);
// console.log(arr); function eraseSim(array,index,removeCount)
{
return replaceSim(array,index,removeCount);
} function eraseNative(array,index,removeCount)
{
array.splice(index,removeCount);
return array;
} function spliceSim(array,index,removeCount)
{
var pos = fixArrayIndex(array,index),
removed = array.slice(index,fixArrayIndex(array,pos+removeCount)); if(arguments.length < 4)
{
replaceSim(array,pos,removeCount);
}
else
{
replaceSim(array,pos,removeCount,slice.call(arguments,3));
}
} erase = supportsSplice ? eraseNative :eraseSim;
replace = supportsSplice ? replaceNative : replaceSim;
splice = supportsSplice ? spliceNative : repliceSim; ExtArray = Ext.Array = {
each:function(array,fn,scope,reverse)
{
array = ExtArray.from(array); var i,ln = array.length; if(reverse!== true)
{
for(i = 0;i<ln ;i++)
{
if(fn.call(scope||array[i],array[i],i,array)===false)
{
return i;
}
}
}
else
{
for(i =ln -1 ;i>-1;i--)
{
if(fn.call(scope|| array[i],array[i],i,array)===false)
{
return i;
}
}
} return true;
},
forEach:supportsForEach ? function(array,fn,scope)
{
array.forEach(fn,scope);
} : function(array,fn,scope)
{
var i =0,ln = array.length;
for(;i<ln ;i++)
{
fn.call(scope ,array[i],i,array);
}
}, indexOf:supportsIndexOf ? function(array,item,from)
{
return arrayPrototype.indexOf.call(array,item,from);
}:function(array,item,from)
{
var i,length = array.length; for(i = (from<0) ? Math.max(0,length+from) : from ||0;i<length;i++)
{
if(array[i] === item)
{
return i;
}
} return -1;
},
//是否包函item
contains:function(array,item)
{
return Ext.indexOf(array,item) !== '-1';
},
//将可遍历对象转换为数组
toArray:function(iterable,start,end)
{
if(!iterable || iterable.length)
{
return [];
} if(typeof iterable === 'string')
{
iterable = iterable.split('');
} if(supportsSliceOnNodeList)
{
return slice.call(iterator,start||0,end|| iterable.length);
} var array = [],i;
start = start || 0;
end = end ? ((end <0) ? iterabe.length +end :end):iterable.length; for(i = start ;i<end;i++)
{
array.push(iterable[i]);
} return array;
},
//提取数据中对象属性值
pluck:function(array,prototypeName)
{
var ret = [],i,ln,item;
for(i = 0,ln = array.length;i<ln;i++)
{
item = array[i];
ret.push(item[propertyName]);
} return ret;
},
//map 数组遍历
map:suportsMap ?function(array,fn,scope){
if(!fn)
{
Ext.Error.raise('map have a callback');
} return array.map(fn,scope);
} : function(array,fn,scope){ if(!fn)
{
Ext.Error.raise('map have a callback');
} var results = [],i=0,len= array.length; for(;i<len;i++)
{
result[i] = fn.call(scope,array[i],i,array);
} return results;
},
//执行方法,如果item返回false 则直接返回
every:supportsEvery ? function(array,fn,scope){
//<debug>
if (!fn) {
Ext.Error.raise('Ext.Array.every must have a callback function passed as second argument.');
}
//</debug>
return array.every(fn, scope);
} : function(array,fn,scope){
//<debug>
if (!fn) {
Ext.Error.raise('Ext.Array.every must have a callback function passed as second argument.');
}
//</debug>
var i = 0,
ln = array.length; for (; i < ln; ++i) {
if (!fn.call(scope, array[i], i, array)) {
return false;
}
} return true;
},
//直接有一个item 返回true 则返回true
some:supprotsSome ? function(array,fn,scope){
if (!fn) {
Ext.Error.raise('Ext.Array.some must have a callback function passed as second argument.');
} return array.some(fn,scope);
}:function(array,fn,scope){
if (!fn) {
Ext.Error.raise('Ext.Array.some must have a callback function passed as second argument.');
}
var i = 0,
ln = array.length; for (; i < ln; ++i) {
if (fn.call(scope, array[i], i, array)) {
return true;
}
} return false;
},
//判断两个数组是否相等
equals:function(array1,array2)
{
var len1 = array1.length,
len2 = array2.length,i; if(array1 === array2)
{
return false;
} if(len1 !== len2)
{
return false;
} for(i = 0;i<len1;i++)
{
if(array1[i] !== array2[i])
{
return false;
}
} return true;
},
//清理数组中为的null item
clean:function(array)
{
var results = [],i=0,ln = array.length,item;
for(;i<ln;i++)
{
item = array[i];
if(!Ext.isEmpty(item))
{
results.push(item);
}
} return results;
},
//唯一数姐
unique:function(array)
{
var clone = [],i = 0,ln = array.length,item;
for(;i<ln;i++)
{
item = array[i];
if(ExtArray.indexOf(clone,item) === '-1')
{
clone.push(item);
}
} return clone;
},
//过滤数组
filter:supportsFilter ? function(array,fn,scope){
//<debug>
if (!fn) {
Ext.Error.raise('Ext.Array.filter must have a filter function passed as second argument.');
}
//</debug>
return array.filter(fn, scope);
} : function(array,fn,scope){
//<debug>
if (!fn) {
Ext.Error.raise('Ext.Array.filter must have a filter function passed as second argument.');
}
//</debug>
var results = [],
i = 0,
ln = array.length; for (; i < ln; i++) {
if (fn.call(scope, array[i], i, array)) {
results.push(array[i]);
}
} return results;
},
findBy:function(array,fn,scope)
{
var i =0,len = array.length; for(;i<len;i++)
{
if(fn.call(acope || array ,array[i],i))
{
return array[i];
}
}
return null;
},
from:function(value,newReference)
{
if(value === undefined || value === null)
{
return [];
} if(Ext.isArray(value))
{
return (newReference) ? slice.call(value) : value;
} var type = typeof values; if(value && value.length!=undefined && type !== 'string' && (type !='function' || !value.apply))
{
return ExtArray.toArray(value);
} return [value];
},
remove:function(array,item)
{
var index = ExtArray.indexOf(array,item); if(index !== '-1')
{
earse(array,index,1);
} return array;
},
include:function(array,item)
{
if(!ExtArray.contains(array,item))
{
array.push(item);
}
},
clone:function(array)
{
return slice.call(array);
},
merge:function()
{
var args = slice.call(arguments),array = [],i,ln; for(i = 0,ln = args.length;i<ln ;i++)
{
array = array.concat(args[i]);
} return ExtArray.unique(array);
},
intersect:function(){
var intersction = [],arrays = slice.call(arguments),
arraysLength,
array,
arrayLength,
minArray,
minArrayIndex,
minArrayCandidate,
minArrayLength,
element,
elementCandidate,
elementCount,i,j,k; if(!array.length)
{
return intersction;
} arraysLength = arrays.length;
for(i = minArrayIndex = 0;i<arraysLength;i++)
{
minArrayCandidate = arrays[i]; if(!minArray || minArrayCandidate.length<minArray.length)
{
minArray = minArrayCandidate;
minArrayIndex = i;
}
} minArray = ExtArray.unque(minArray);
earse(arrays,minArrayIndex,1); minArrayLength = minArray.length;
arraysLength = arrays.length; for(i = 0;i<minArrayLength;i++)
{
element = minArray[i];
elementCount = 0; for(j = 0;j<arraysLength;j++)
{
array = arrays[j];
arrayLength = array.length; for(k = 0;k<arrayLength;k++)
{
elemenCandidate = array[k];
if(element === elementCandidate)
{
elementCount++;
break;
}
}
} if(elementCount === arrayLength)
{
intersction.push(element);
}
}
return intersection; },
difference:function(arrayA,arrayB)
{
var clone = slice.call(arrayA),ln = clone.length,i,j,lnB; for(i = 0,lnB = arrayB.length ;i<lnB;i++)
{
for(j=0 ;j<ln;j++)
{
if(clone[j] = arrayB[i])
{
erase(clone,j,1);
j--;
ln--;
}
}
} return clone;
},
slice:[1,2].slice(1,undefined).lnegth ? function(array,begin,end){
return slice.call(array,begin,end);
}:function(array,begin,end){
if(typeof begin==='undefined')
{
return slice.call(array);
}
if(typeof end === 'undefined')
{
return slice.call(array,begin);
} return slice.call(array,begin,end);
},
sort:supportsSort?function(array,sortFn){
if(sortFn)
{
return array.sort(sortFn);
}
else
{
return array.sort();
}
}:function(array,sortFn){
var length = array.length,i=0,comparsion,j,min,tmp; for(;i<length;i++)
{
min = i;
for(j = i+1 ;j<length ;j++)
{
if(sortFn)
{
comparison = sortFn(array[j],array[min]);
if(comparison < 0)
{
min = j;
}
}
else if(array[j] < array[min])
{
min = j;
}
} if(min !== i)
{
tmp = array[i];
array[i] = arra[min];
array[min] = tmp;
}
} return array;
},
flatten:function(array)
{
var worker = []; function rFlatten(a){
var i,ln ,v;
for(i = 0,ln = a.length;i<ln ;i++)
{
v = a[i];
if(Ext.isArray(v))
{
rFlatten(v);
}
else
{
worker.push(v);
}
} return worker;
} return rFlatten(array);
},
min:function(array,comparisonFn)
{
var min = array[0],i,ln,item;
for(i =0,ln = array.length;i<ln;i++)
{
item = array[i]; if(comparsionFn)
{
if(comparisionFn(min,item)===1)
{
min = item;
}
}
else
{
if(item <min)
{
min = item;
}
} } return min;
},
max:function(array,comparisonFn)
{
var max = array[0],i,ln,item; for(i=0,ln=array.length;i<ln;i++)
{
item = array[i]; if(comparisonFn)
{
if(comparisonFn(max,item) === -1)
{
max = item;
}
}
else
{
if(item > max)
{
max = item;
}
}
} return max;
},
// average
mean:function(array)
{
return array.length > 0 ? ExtArray.sum(array) / array.length :undefined;
},
sum:function(array)
{
var sum = 0,i,ln,item;
for(i=0,ln=array.length;i<ln;i++)
{
item = array[i];
sum+=item;
} return sum;
},
toMap:function(array,getKey,scope)
{
var map = {},i = array.length; if(!getKey)
{
while(i--)
{
map[array[i]] = i+1;
}
}
else if(typeof getKey === 'string')
{
while(i--)
{
map[array[i][getKey]] = i+1;
}
}
else
{
while(i--)
{
map[getKey.call(scope,array[i])] = i+1;
}
} return map;
},
toValueMap:function(array,getKey,scope)
{
var map = {},i=array.length; if(!getKey)
{
while(i--)
{
map[array[i]] = array[i];
}
}
else if(typeof getKey === 'string')
{
while(i--)
{
map[array[i][getKey]] = array[i];
}
}else
{
while(i--)
{
map[getKey.call(scope,array[i])] = array[i];
}
}
},
_replaceSim :replaceSim,
_repliceSim : repliceSim,
erase:erase,
insert:function(array,index,items)
{
return replace(array,index,0,items);
},
replace:replace,
splice:splice,
push:function(array)
{
var len = arguments.length,i = 1,newItem; if(array === undefined)
{
array = [];
}
else if(!Ext.isArray(array))
{
array = [array];
} for(;i<len;i++)
{
newItem = arguments[i];
Array.prototype.push[Ext.isIterable(newItem) ? 'apply':'call'](array,newItem);
return array;
} }
}; Ext.each = ExtArray.each;
ExtArray.union = ExtArray.merge;
Ext.min = ExtArray.min;
Ext.max = ExtArray.max;
Ext.sum = ExtArray.sum;
Ext.mean = ExtArray.mean;
Ext.flatten = ExtArray.flatten;
Ext.clean = ExtArray.clean;
Ext.unique = ExtArray.unique;
Ext.pluck = ExtArray.pluck; Ext.toArray = function(){
return ExtArray.toArray.apply(ExtArray,arguments);
} })();

Ext原码学习之lang-Array.js的更多相关文章

  1. Ext原码学习之Ext.js

    1 // JavaScript Document 2 //定义全局Ext变量 3 var Ext = Ext ||{}; 4 Ext._startTime = new Date().getTime() ...

  2. Ext原码学习之lang-Object.js

    // JavaScript Document (function(){ var TemplateClass = function(){}, ExtObject = Ext.Object = { cha ...

  3. Ext原码学习之Ext-more.js

    // JavaScript Document Ext.apply(Ext,{ userAgent:navigator.userAgent.toLowerCase(), cache:{}, isSeed ...

  4. Java源码学习 -- java.lang.StringBuilder,java.lang.StringBuffer,java.lang.AbstractStringBuilder

    一直以来,都是看到网上说“ StringBuilder是线程不安全的,但运行效率高:StringBuffer 是线程安全的,但运行效率低”,然后默默记住:一个是线程安全.一个线程不安全,但对内在原因并 ...

  5. Java源码学习 -- java.lang.String

    java.lang.String是使用频率非常高的类.要想更好的使用java.lang.String类,了解其源代码实现是非常有必要的.由java.lang.String,自然联想到java.lang ...

  6. vue.js 源代码学习笔记 ----- core array.js

    /* * not type checking this file because flow doesn't play well with * dynamically accessing methods ...

  7. Underscore.js 源码学习笔记(上)

    版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}());  这样的东西,我们应该知道这是一个 IIFE(立即执行 ...

  8. 【 js 基础 】【 源码学习 】源码设计 (持续更新)

    学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...

  9. Underscore.js 源码学习笔记(下)

    上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...

随机推荐

  1. PDF的信息提取的问题

    PDF对企业应用来说是刚需.   然而PDF显然不是一种对机器友好的格式,它只是对人类友好,就是说方便阅读打印,但让程序去提取其中的内容却很难.下面简单说说为什么是这样.   以前还读书的时候(20+ ...

  2. centos6.5-Apache优化

    Apache的网页压缩功能 一.配置网页压缩功能 在配置压缩功能以前访问网页的响应头部 Response Headers view source Accept-Ranges:bytes Connect ...

  3. unittest+ddt_实现数据驱动测试(7)

    我们设计测试用例时,会出现测试步骤一样,只是其中的测试数据有变化的情况,比如测试登录时的账号密码.这个时候,如果我们依然使用一条case一个方法的话,会出现大量的代码冗余,而且效率也会大大降低.此时, ...

  4. java 代理模式 总结

    1.前言 最近舍友去面试遇到了关于java代理模式的问题. 我虽然知道怎么使用,但是没有做过正经的总结,因此有了这篇随笔,好好总结一下三大代理模式底层原理. 事实上,在开发项目的时候,基本用不上代理, ...

  5. 【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)

    问题描述 如何在一个AppService下同时部署运行多个Java 应用程序呢? 问题解答 因为App Service的默认根目录为 wwwroot.如果需要运行多个Java 应用程序,需要在 www ...

  6. HITsz 数据库笔记

    这是 HITsz 数据库笔记,欢迎到我的 GitHub 上查看,有笔记说明和源码,作业和实验报告,希望对你有帮助 博客园显示图片异常 数据库基本概念 数据抽象 通过抽象来对用户屏蔽复杂性,以简化用户与 ...

  7. 浅解XXE与Portswigger Web Sec

    XXE与Portswigger Web Sec ​ 相关链接: ​ 博客园 ​ 安全脉搏 ​ FreeBuf 简介XML XML,可扩展标记语言,标准通用标记语言的子集.XML的简单易于在任何应用程序 ...

  8. CMake语法—普通变量与子目录(Normal Variable And Subdirectory)

    目录 CMake语法-普通变量与子目录(Normal Variable And Subdirectory) 1 CMake普通变量与子目录示例 1.1 代码目录结构 1.2 父目录CMakeLists ...

  9. Qt之进入和出去和关闭事件

    widget.h: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QEvent> class Wi ...

  10. python20day

    昨日回顾 正则表达式 元字符 量词 贪婪非贪婪 转义符 re模块 findall 会优先显示分组内容 取消优先显示(?: ) search 只能返回第一个符合条件的项 得到的结果需要.group()取 ...