数组,类数组
一、数组
1.数组的定义
1) 字面量 var arr=[1,2,3];
2)构造方法 new Array(length/content)
2.数组的方法
1)改变原数组 :push ,pop ,shift, unshift ,reverse , splice ,sort
2)不改变原数组:concat ,toString,slice,join <=> split
// push :向数组末尾添加一个或多个元素,返回新的长度 var arr=[]; Array.prototype.push=function(){ for(var i=0;i<arguments.length;i++){ this[this.length]=arguments[i]; } return this.length; } arr.push(1,2,3); //3
// pop 删除最后一个元素,返回数组的最后一个元素 // shift 删除第一个元素,返回数组的第一个元素 // unshift 向数组开头添加一个或多个元素,并返回新的长度。 // reverse 数组逆转顺序,并返回新数组 var arr=[1,2,3,4]; arr.reverse(); //[4, 3, 2, 1]
// splice 删除元素,并向数组添加新元素,返回被截取元素的数组 // arr.splice(从第几位开始,截取多少的长度,在切口处添加新的数据); var arr=[1,2,3,4]; arr.splice(1,2,0,0,0);//[2, 3] console.log(arr); // [1, 0, 0, 0, 4] arr.splice(3,0,5);//[] console.log(arr); // [1, 2, 3, 5, 4]
// sort 排序,返回排序后的数组 // 1.必须写两个形参 // 2.看返回值。 // 1)返回值为负数时,那么前面的数在前 // 2)正数,后面的数在前 // 3)0,不动 arr.sort(function(a,b){ return a-b;//升序 // return b-a;//降序 }) // 给一个有序的数组,乱序 var arr=[1,2,3,4,5,6,7]; arr.sort(function(){ return Math.random()-0.5; }); // 按字符串长度排序 var arr=['adadsd','asds','ss','sdw']; arr.sort(function(a,b){ return a.length-b.length }); console.log(arr); //["ss", "sdw", "asds", "adadsd"]
//concat 连接两个或更多的数组,并返回连接后的数组
// toString 把数组转换为字符串,并返回结果。//[1,2,3]--> '1,2,3'
// slice 数组截取,返回被截取元素的数组
// slice(从该为开始截取,截取到该位)
var arr=[1,2,3,4];
arr.slice(1,3);// [2, 3]
arr.slice(1);//[2, 3, 4] 一个参数表示截取到末尾
arr.slice(-1);//[4] 负数表示:-1+数组的长度=3
arr.slice();//[1, 2, 3, 4] 没有参数:全部截取
//join 元素通过指定的分隔符进行分隔,返回字符串 // split 字符串方法,通过指定分隔符切割,返回数组 var arr=[1,2,3]; var str=arr.join('-');//'1-2-3' var newArr=str.split('-');//["1", "2", "3"] // 字符串拼接 var str='wang'; var str1='liu'; var str2='aswewe'; var arr=[str,str1,str2]; arr.join('');//"wangliuaswewe"
3.数组去重
// 数组去重(哈希) Array.prototype.unique=function(){ var obj={}, arr=[], len=this.length; for(var i=0;i<len;i++){ if(!obj[this[i]]){ obj[this[i]]='abc'; arr.push(this[i]); } } return arr; } var arr=[1,1,1,1,2,2,2,2,3,3,3,7,8,8,9]; var newArr=arr.unique();// [1, 2, 3, 7, 8, 9]
4.区分数据类型
// 1.分两类 原始值,引用值 // 2.区分引用值 function typeFn(target){ var template={ '[object Array]':'array', '[object Object]':'object', '[object Number]':'number-object', '[object Boolean]':'boolean-object', '[object String]':'string-object', } if(target===null) return 'null'; if(typeof(target)=='object'){ // 数组 ,对象,包装类 var str=Object.prototype.toString.call(target); return template[str]; }else{ // function, number,string,boolean,undefined, return typeof(target); } }
5.数组循环的方法
I.参数相同 。两个参数:(循环回调函数(当前元素,当前元素的索引,原数组),this指向谁)
不会改变原始数组 ,不会对空数组进行检测
1.forEach :代替普通for循环,没有返回值
2.map :通过指定函数处理数组的每个元素,并返回处理后的数组。
1) 正常情况下,需要return,返回一个新数组
2) 若是没有return,相当于forEach,返回全部是undefiend的数组,[undefined, undefined, undefined]
3.filter: 过滤 ,返回符合条件所有元素的数组。
1)过滤一些不合格元素,如果回调函数返回true,就留下来
3)不会改变原始数组 ,不会对空数组进行检测
4.some :检测数组中是否有元素符合条件。返回true或false
类似查找,数组里面某一个元素符合条件,返回true
5.every :检测数值中的每个元素是否都符合条件。返回true或false
数组里面所有元素都符合条件,返回true
II.参数不同 。两个参数:(回调函数(计算结束后的返回值, 当前元素, 当前元素的索引, 原数组), 传递给函数的初始值)
1.reduce :将数组元素计算为一个值(从左到右)。返回计算结果
2.reduceRight :将数组元素计算为一个值(从右到左)。返回计算结果
// 1. forEach:代替普通for循环,没有返回值 let arr=['apple','banana','orange']; let newarr=arr.forEach(function(val,index,arr){ console.log(val,index,arr); // apple 0 ["apple", "banana", "orange"] // banana 1 ["apple", "banana", "orange"] // orange 2 ["apple", "banana", "orange"] }); console.log(newarr);//undefined // 2.map 重新整理数据结构 let arr=['apple','banana','orange']; var newArr=arr.map(function(item,index,arr){ return item+'123'; }); console.log(newArr); // ["apple123", "banana123", "orange123"] console.log(arr);//["apple", "banana", "orange"] // 3.filter:过滤 过滤一些不合格元素,如果回调函数返回true,就留下来 let arr=[{ name:'as',age:12 },{ name:'asas',age:21 },{ name:'xcxc',age:18 }] var newArr=arr.filter((item,index,arr)=>{ return item.age<20; }); console.log(newArr);//0: {name: "as", age: 12} 1: {name: "xcxc", age: 18} console.log(arr);//原数组不变 // 4.some :类似查找,数组里面某一个元素符合条件,返回true let arr=['apple','banana','orange']; var newArr=arr.some((val,index,arr)=>{ return val=='apple' }) console.log(newArr);//true // 5.every:数组里面所有元素都符合条件,返回true let arr=[1,3,9,8]; var newArr=arr.every((val,index,arr)=>{ return val<10 }) console.log(newArr);//true
// 6.reduce ,从左到右 // 求数组的和, let arr=[1,2,3,4,5]; let res=arr.reduce((prev,cur,index,arr)=>{ console.log(prev);//1,3,6,10 return prev+cur; }); console.log(res);//15 // 7.reduceRight ,从右到左 let arr=[1,2,3,4,5]; let res=arr.reduceRight((prev,cur,index,arr)=>{ console.log(prev);//5,9,12,14 return prev+cur; }); console.log(res);//15
III. 循环for of
let arr=['a','b','c']; for(let val of arr){ console.log(val);// a b c } // keys() 数组下标 。用于从数组创建一个包含数组键的可迭代对象。 let keys=arr.keys(); console.log(keys.next().value);//0 for(let index of arr.keys()){ console.log(index);// 0 1 2 } // entries() 数组某一项。返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)。 var entries=arr.entries(); console.log(entries.next().value);//[0, "a"] for(let item of arr.entries()){ console.log(item);//[0, "a"] [1, "b"] [2, "c"] console.log(item[0]); // 0 1 2 } for(let [index,val] of arr.entries()){ console.log(index);// 0 1 2 console.log(val);// a b c }
IV 循环中的return,break报错:Illegal break statement
可以用 some(return true;),every,跳出循环
// every
// return true ;return false ; 跳出循环 返回 1 let arr=[1,2,3]; arr.every(function(val) { if(val==2){ return false; } console.log(val);//1 }, this); // some
// return true ;跳出循环 返回 1 // return false ;跳出本次循环 返回 1,3 let arr=[1,2,3]; arr.some(function(val) { if(val==2){ return true; } console.log(val);//1 }, this); // forEach,filter ,map // return true ;return false ;跳出本次循环 返回 1,3 let arr=[1,2,3]; arr.map (function(val) { if(val==2){ return false; } console.log(val);//1 }, this);
二、类数组 (eg:arguments)
属性要为索引(数字)属性,必须有length属性,最好加上push
1.可以利用属性名模拟数组的特性
2.可以动态的增长length属性
3.如果强行让类数组调用push方法,则会根据length属性值的位置进行属性的扩充
var obj={ '2':'a', '3':'b', 'length':2, 'push':Array.prototype.push, } obj.push('d'); obj.push('e'); obj.push('f'); //obj-> {2: "d", 3: "e", 4: "f", length: 5, push: ƒ} Array.prototype.push=function(target){ obj[obj.length]=target; obj.lenth++; }
浙公网安备 33010602011771号