每次测试的时候都要用alert ,弹的烦死了还得点击确定,才能继续测试
1 自己写一个写日志的函数以后测试直接用,当然也可以用 console.log("===自己喜好=");
/* * function 写日志的函数 * html 加载结束后在调用这个函数 即放到body下面 * 参数1 logStr 需要写的日志 * 参数2 id 写到什么地方 不写这个参数则打印到页面上 */ function writeData( logStr ,id ){ if(logStr==null || logStr=='' ) return ; var logObjId= id==null? "":id ; var logObj = document.getElementById(logObjId); //如果没有给出日志写到哪里则 logObj = logObj||document.getElementsByTagName('body')[0]; logObj.innerHTML = logObj.innerHTML + " "+logStr ; }
最近用数组的时候,发现Array的好多函数有的浏览器不兼容,
参考网上的函数弄来这些扩展函数个,以后就可以兼容使用。
2 indexOf
//item 需要循环的数组 index 从第几个开始循环 Array.prototype.indexOf=function(item, index) { var n = this.length, //判断空 i = index == null ? 0 : index ; //判断负数 i = i < 0 ? Math.max(0, n + i) : i; for (; i < n; i++) if (i in this && this[i] === item) return i; return -1 } var arrs = ["红",'绿' ,'蓝']; //测试代码 writeData( arrs.indexOf( "蓝" ,5) ,'colorpicker');
// 从数组中找会后一个匹配的内容
3 lastIndexOf函数
// item 需要循环的数组 index 从倒数第几个开始循环
Array.prototype.lastIndexOf = function(item, index) {
var n = this.length,
i = index == null ? n - 1 : index;
if (i < 0) i = Math.max(0, n + i);
for (; i >= 0; --i){
writeData( i + "== "+this[i] ,'colorpicker1');
if (i in this && this[i] === item) return i;
}
return -1
};
var arrs = ["红",'绿' ,'蓝',"红",'绿' ,'蓝'];
writeData( arrs.lastIndexOf( "红" , 2 ) ,'colorpicker1');
4 forEach 函数
/* * fn 回调函数 * thisObj 在那个对象上执行此函数,如果没有则window */ Array.prototype.forEach = function(fn, thisObj) { var scope = thisObj || window; for ( var i=0, j=this.length; i < j; ++i ) { //表示在当前这个窗口调用fn函数 给这个函数传 三个参数 fn.call(scope, this[i], i, this); } }; var arrs = ["红",'绿' ,'蓝']; //测试代码 arrs.forEach(function( b ,c,d ){ writeData( " " + b +" "+c +" ========= "+d+"<br>",'colorpicker') ; });
5 every 判断数组中每一个 数据 是否都符合 给定的函数
/* * fn 回调函数 * thisObj 在那个对象上执行此函数,如果没有则window */ Array.prototype.every = function(fn, thisObj) { var scope = thisObj || window; for ( var i=0, j=this.length; i < j; ++i ) { if ( !fn.call(scope, this[i], i, this) ) { return false; } } return true; }; //测试代码 var arrs =[45,67,88,92,71]; var pass = arrs.every(function( item , index ){ //item = parseInt( item ) ; if(item < 60 ){ return false; }else{ return true; } }); writeData( pass+"" ,'colorpicker');
6 数组中的数据 按照一定规则过滤然后返回新的数组
/* * fn 回调函数 * thisObj 在那个对象上执行此函数,如果没有则window * 功能: 遍历数组,把每一个执行的结果放到数组中 */ Array.prototype.map = function(fn, thisObj) { var scope = thisObj || window; var a = []; for ( var i=0, j=this.length; i < j; ++i ) { a.push(fn.call(scope, this[i], i, this)); } return a; }; //测试代码 把小于0的全都替换成0 var arrs =[45,67,88,92,-1]; var newArr = arrs.map(function(item, index ){ return Math.max(0,item); }); writeData( newArr+"" ,'colorpicker');
7 remove 删除指定的元素
/* * fn 回调函数 * 功能: 从数组中删除指定的元素 */ Array.prototype.remove = function(element) { for (var i = this.length; i >=0;i--) { if (element === this[i]) this.splice(i, 1); } return this; } //测试代码 删除元素 var arrs =[45,67,88,92,-1]; var newArr = arrs.remove( 88 );
8 unique 去除 一样的元素
/* * fn 回调函数 * thisObj 在那个对象上执行此函数,如果没有则window * 功能: 把重复的数据去掉 */ Array.prototype.unique=function(){ var ret = []; o:for(var i = 0, n = this.length; i < n; i++) { for(var x = i + 1 ; x < n; x++) { if(this[x] === this[i]) continue o; } ret.push(this[i]); } return ret; } //测试代码 把重复的数据去掉 var arrs =[45,67,88,92,78,45,45,'技术','技术']; //writeData( newArr+"" ,'colorpicker'); writeData( arrs.unique( ) +"" ,'colorpicker'); //另一种实现方式 function uniq(array){ var ret = [],ri = 0 array = array.sort(); ret[ri] = array[0]; for(var j = 1, n = array.length; j < n; j++){ if(ret[ri] !== array[j]){ ret[++ri] = array[j] } } return ret; }
9 最大值与最小值
一般写法
/* * fn 回调函数 * thisObj 在那个对象上执行此函数,如果没有则window * 功能: 取出数组中最大值 与 最小值 */ Array.prototype.max = function() { var max = this[0]; var len = this.length; for (var i = 1; i < len; i++){ if (this[i] > max) { max = this[i]; } } return max; } Array.prototype.min = function() { var min = this[0]; var len = this.length; for (var i = 1; i < len; i++){ if (this[i] < min){ min = this[i]; } } return min; } //避免其他类库中含有这个函数的扩展 if (typeof Array.prototype['max'] == 'undefined') { Array.prototype.max = function() { //************略************* } }
网上的大师级别给了另一种实现方法,简介,并且少了函数的创建,减少网络数据的传输量
/*
* fn 回调函数
* thisObj 在那个对象上执行此函数,如果没有则window
* 功能: 取出数组中最大值 与 最小值
*/
Array.prototype.max = function( ){
return Math.max.apply( {}, this );
};
Array.prototype.min = function( ){
return Math.min.apply( {}, this );
};
//alert( Array.prototype['max'] );
if (typeof Array.prototype['max'] == 'undefined') {
Array.prototype.max = function() {
// ******略*************
}
}
10 数组遍历each 实现
//数组 深度遍历 , 这个函数 是深度递归调用的使用 // 可以深度递归数组 Array.prototype.each = function(fn){ for(var i=0;i<this.length ; ++i ){ //如果是数组 就调用each 不是数组就调用传进来的方法 this[i].constructor==Array? this[i].each(fn): fn.call( this[i], i ); } } // var print = function( obj ,i ){ writeData(this, 'log' ); } var arrs = [1,2,3,[7,8,9,[10,11,12]],4,5 ]; arrs.each( print );
//数组的遍历 Array.prototype.each = function(fun){ if(Array.prototype.foreach){ //javascript1.6函数 this.foreach(fun); }else{ for(var i=0, len = this.length ;i<len;i++ ){ fun( this[i],i); } } }
11 //数组中包含某个元素
Array.prototype.contains = function (obj) { return this.indexOf(obj) != -1; };
12 数组的某个位置插入元素
Array.prototype.insertAt = function (obj, i) { this.splice(i, 0, obj); };
13 数组去重
function uniq1(array) { var n = array.length; for (var i = 0; i < n - 1; i++) for (var j = i + 1; j < n;) if (array[i] === array[j]) { array.splice(j, 1); n--; }else{ j++; } return array; }