就目前来说,数组和对象这两种存储方式用的频率最大,而且存储数据也非常好用,下面我将列举出数组的大部分方法,并说明每一种方法的具体用法。
1、push
1.1含义:在数组末尾增加元素,可以增加多个,,改变原数组,返回值是新数组的长度。
var arr = [1,2,5,6];
var arr1 = arr.push(1);
console.log(arr,arr1)//[1,2,5,6,1] 4
var arr1 = arr.push(1,5,6)
console.log(arr,arr1)//[1,2,5,6,1,5,6] 7
如果说在在数组末尾增加的是一个数组,那么结果如下所示:
var arr1 = arr.push([2,5,8])
console.log(arr,arr1) //[1,2,5,6,array(3)] 5
1.2重构push
function push(arr){
for(var i = 1;i < argument.length;i++){
arr[length] = argument[i];
}
return arr.length;
}
push(arr,1,6,8);
2、pop
2.1含义:在数组末尾每次删除一个,注意一次只能删除一个,改变原数组,返回删除的元素,值得注意的是当数组里存储的是对象时,在删除之前需要将所有的引用设为null。
var arr = [1,2,5,6];
var arr1 = arr.pop();
console.log(arr,arr1)//[1,2,5] 6
2.2重构
var arr = [1,2,5,6];
function pop(arr){
var ele = arr[length-1];
if(arr.length>0) arr.length--;
return ele;
}
push(arr);
3、unshift
3.1含义:在数组头部增加一个或多个元素,改变原数组,返回新数组的长度
var arr = [1,2,5,6];
var arr1 = arr.unshift(1,2,3);
console.log(arr,arr1)//[1,2,3,1,2,5,6] 7
3.2重构
var arr = [1,2,5,6];
function unshift(){
var len = arguments.length-1;
for(var i = 0;i < arr.length;i++){
arr[i + len] = arr[i];
arr[i] = null;
}
for(var j = 1; j < arguments.length-1;j++){
arr[j-1] = arguments[j];
}
return arr.length
}
unshift(arr,1,4,7);
4、shift
4.1含义:在数组头部每次删除一个元素,改变原数组,返回的是删除的元素
var arr = [1,2,5,6];
var arr1 = arr.shift();
console.log(arr,arr1)//[2,5,6] 1
4.2重构
function shift(arr){
var ele = arr[0];
for(var i = 0;i < arr.length;i++){
arr[i-1] = arr[i];
}
if(arr.length>0) arr.length--;
return ele;
}
shift(arr);
5、join
5.1含义:连接符,将数组的元素以某一个字符连接成一个字符串,默认以","连接,不改变原数组。
var arr = [1,2,5,6];
var arr1 = arr.join();
console.log(arr1)//1,2,5,6
var arr1 = arr.join("+");
console.log(arr1)//1+2+5+6
5.2重构join
function join(arr,separator){
if(separator === undefined) separator = ",";
var separator = string(separator);
var str = "";
for(var i = 0; i < arr.length;i++){
if(!arr[arr.length-1]) str += arr[i] + separator ;
else str+=arr[i];
}
return str;
}
6、concat
6.1含义:数组连接多个数组,也可以连接单个元素,返回一个新连接完的数组,不改变原数组,与原数组无引用关系,引用关系我这里就不具体说了,总之它和引用数据类型有关。
var arr = [1,2,5,6];
var arr1 = arr.concat(1);
console.log(arr1);// [1,2,5,6,1]
var arr1 = arr.concat([2,8,9]);
console.log(arr1);// [1,2,5,6,2,8,9]
当然也可用此方法复制数组
var arr1 = arr.concat();
6.2重构
function concat(arr){
var arr1 = [];
for(var i = 0;i < arr.length;i++){
arr1[i] = arr[i];
}
if(arguments.length===1) return arr1;
for(var j = 1;j<arguments.length;j++){
if(arguments[j]!==null && arguments[j].constructor===Array){
for(var k = 0;k<arguments[j].length;k++){
arr1[arr1.length] =arguments[j][k];
}
}else{
arr1[arr1.length] = arguments[j];
}
}
return arr1;
}
7、splice
7.1含义
分为三种情况:1、当splice只含有一个参数时(参数为正数),表示从此位置一直删除到数组末尾,返回删除的元素组成的新数组,此方法会改变原数组;
var arr = [1,2,5,6];
var arr1 = arr.splice(2);
console.log(arr,arr1);//[1,2] [5,6]
当参数为负值时,表示从右向左到第几个,并从此位置向右删除到数组末尾。
var arr = [1,2,5,6];
var arr1 = arr.splice(-3);
console.log(arr,arr1);//[1] [2,5,6]
2、当splice有两个参数时(splice(m,n)),表示从m删除n个元素,也就是说第一个参数代表某个位置,第二个是要删除的个数。
var arr = [1,2,5,6];
var arr1 = arr.splice(1,2);
console.log(arr,arr1);//[1,6] [2,5]
说明:如果第一个参数为负数时(splice(-m,n)),表示从右往左数到m个位置,并从m位置向右删除n个元素,返回删除的元素组成的数组。
var arr = [1,2,5,6];
var arr1 = arr.splice(-2,2);
console.log(arr,arr1);//[1,2] [5,6]
3、当splice有三个参数时(splice(m,n,k)),表示从m位置删除n个元素之后,插入k,k不止一个,可能有多个。
var arr = [1,2,5,6];
var arr1 = arr.splice(1,arr.length,0,-1,-2);//表示从数组下标为1的元素一直删除到数组末尾,再将0,-1,-2插进去。
console.log(arr,arr1);//[1,0,-1,-2] [2,5,6]
注意:var arr1 = arr.splice(0)
将一个数组的所有元素转移到另一个数组,不是复制。
var arr1 = arr.splice()
没有删除返回空数组
说明:此方法的重构作为练习,通过1、2、3三部分相信我讲的应该够清楚,按照所列举的功能依次判断去实现它,不过呢如果有同学通过我写的思路还是构造不出来的话,下方留言,第一时间会回复哦。
8、slice
8.1含义:1、当参数只有一个时slice(m),表示从从下标为m的元素一直截取到数组末尾,改变原数组,返回截取到的元素组成的修数组。
var arr = [1,2,5,6];
var arr1 = arr.slice(1);
console.log(arr,arr1);//[1] [2,5,6]
2、当有两个参数时slice(m,n),表示截取从下标为m的元素开始到下标为n的元素之前,不包括最后一项。
var arr = [1,2,5,6];
var arr1 = arr.slice(1,3);
console.log(arr,arr1);//[1,6] [2,5]
注意:var arr1 = arr.slice()
//复制原数组到新数组,没有引用关系
var arr1 = arr.slice(0)
//复制数组
8.2重构
function slice(arr,start,end){
if(start === undefined) start=0;
if(end === undefined) end = arr.length;
start = Number(start);
end = Number(end);
if(!isNaN(end) && isNaN(start)) start=0;
if(isNaN(start)) return [];
if(start < 0) start = arr.length + start;
if(start < 0) start = arr.length + end;
var arr1 = [];
for(var i = start;i < end;i++){
arr1[i - start] = arr[i];
}
return arr1;
}
说明:以上条件有缺乏的或者小编考虑不周的可以给小编留言哦!
9、some、every
9.1some:原意是指某些,在这里的含义是当数组中的元素有满足条件的就返回true,否则就返回false;
var arr = [1,2,5,6];
var arr1 = arr.some(function(item){
return item>2;
})
console.log(arr1);//true
9.2every:原意是指每一个,在这里的含义是当数组中的所有元素满足条件的就返回true,否则就返回false;
var arr = [1,2,5,6];
var arr1 = arr.every(function(item){
return item>2;
})
console.log(arr1);//false
重构some(使用桥接模式),every重构和some类似
function fn(item,index,arr){
return item>2;
}
function some(arr,fn){
for(var i = 0; i < arr.length;i++){
if(i in arr && fn(arr[i],i,arr)) return true;
}
return false;
}
10、indexOf 、lastindexOf
10.1含义:如果只有一个参数时,就查找该元素的索引,如果找到则返回该元素所在的下标,没找到则返回-1;
var arr = [1,2,5,6];
var index = arr.indexOf(1);
console.log(index);//0
如果只有二个参数时(indexOf(m,n)),查找m元素的索引,不过是从下标为n的元素开始查找,如果找到则返回该元素所在的下标,没找到则返回-1;
var arr = [1,2,5,6];
var index = arr.indexOf(1,2);
console.log(index);//-1 找不到
重构indexOf
function indexOf(arr,search,index){
if(index === undefined) index = 0;
for(var i = index; i < arr.length; i++){
if(arr[i] == search) return i;
}
return -1;
}
lastindexOf用法和indexOf类似,就不再详解了。
11、fill
11.1含义:fill有三个参数,fill(m,n,k),m是要填充的值,n是起始位置,k是结束位置,如果不给开始位置和结束位置,就会全部填充覆盖。
var arr = Array(6).fill(10)
var arr = Array(6).fill({a:1})
注意:fill只能用于有长度的数组,而且如果填充的元素是对象时,是有引用关系的,当改变其中一个元素时,其它的都会变,例子可以自己写写看。
12、
12.1 forEach
arr.forEach(function(item,index,arr){});
有三个参数:item是数组中的每一个元素,index是数组元素的下标,arr就是原数组。
遍历数组时,forEach相比较for循环来说不会遍历到空元素,相比较for-in不会遍历到数组的属性,有同学可能会问数组也有属性?对的,数组也是对象。
12.2 map
arr.map(function(item,index){})
说明:将满足条件的元素形成一个新数组,使用return返回,并且新数组的长度和原数组相同。
13、filter、reduce
含义:过滤和归并
var arr = [1,8,3,4,5,6];
var arr1 = arr.filter(function(item,index,arr){
return item > 3;
});
console.log(arr1);
说明:filter 返回的是满足条件的值组成的数组
reduce:reduce有四个参,value如果不给初始值,那么value就是数组的第一个元素,并且遍历数组时会从下标为1的元素开始;如果value有初始值,那么数组将会从第一个元素开始遍历。
//计算数组元素的和
var arr=[1,2,3,4,5,6,7];
var sum = arr.reduce(function(value,item,index,arr){
console.log(value,item,index);
return value+=item;
})
//找数组中元素的最大值或最小值。
var arr=[1,2,3,4,5,6,7];
var max = arr.reduce(function(value,item){
return value > item ? value:item;
// return value < item ? value:item;
})
console.log(max);
13、使用while、for、indexOf完成数组去重
var arr=[1,3,3,6,8,2,3,5,6,3,7,9,8,3,6,7,3,8,9];
for(var i = 0; i < arr.length;i++){
var index = i;
while(index > -1){
index = arr.indexOf(arr[i],index+1);
if(index > -1) delete arr[i]
}
}
说明:使用delete会使得数组变为松散型结构,什么是松散型我会在后面讲解。
以上有不足的,还请指正!