就目前來說,數(shù)組和對象這兩種存儲方式用的頻率最大这揣,而且存儲數(shù)據(jù)也非常好用,下面我將列舉出數(shù)組的大部分方法,并說明每一種方法的具體用法给赞。
1机打、push
1.1含義:在數(shù)組末尾增加元素,可以增加多個,片迅,改變原數(shù)組惕稻,返回值是新數(shù)組的長度旷痕。
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
如果說在在數(shù)組末尾增加的是一個數(shù)組俘种,那么結(jié)果如下所示:
var arr1 = arr.push([2,5,8])
console.log(arr,arr1) //[1,2,5,6,array(3)] 5
1.2重構(gòu)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含義:在數(shù)組末尾每次刪除一個平匈,注意一次只能刪除一個容燕,改變原數(shù)組操软,返回刪除的元素详瑞,值得注意的是當數(shù)組里存儲的是對象時遗嗽,在刪除之前需要將所有的引用設(shè)為null粘我。
var arr = [1,2,5,6];
var arr1 = arr.pop();
console.log(arr,arr1)//[1,2,5] 6
2.2重構(gòu)
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含義:在數(shù)組頭部增加一個或多個元素痹换,改變原數(shù)組征字,返回新數(shù)組的長度
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重構(gòu)
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含義:在數(shù)組頭部每次刪除一個元素娇豫,改變原數(shù)組匙姜,返回的是刪除的元素
var arr = [1,2,5,6];
var arr1 = arr.shift();
console.log(arr,arr1)//[2,5,6] 1
4.2重構(gòu)
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含義:連接符冯痢,將數(shù)組的元素以某一個字符連接成一個字符串氮昧,默認以","連接,不改變原數(shù)組浦楣。
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重構(gòu)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含義:數(shù)組連接多個數(shù)組,也可以連接單個元素振劳,返回一個新連接完的數(shù)組椎组,不改變原數(shù)組,與原數(shù)組無引用關(guān)系历恐,引用關(guān)系我這里就不具體說了寸癌,總之它和引用數(shù)據(jù)類型有關(guān)。
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]
當然也可用此方法復(fù)制數(shù)組
var arr1 = arr.concat();
6.2重構(gòu)
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只含有一個參數(shù)時(參數(shù)為正數(shù)),表示從此位置一直刪除到數(shù)組末尾哮洽,返回刪除的元素組成的新數(shù)組填渠,此方法會改變原數(shù)組;
var arr = [1,2,5,6];
var arr1 = arr.splice(2);
console.log(arr,arr1);//[1,2] [5,6]
當參數(shù)為負值時,表示從右向左到第幾個氛什,并從此位置向右刪除到數(shù)組末尾莺葫。
var arr = [1,2,5,6];
var arr1 = arr.splice(-3);
console.log(arr,arr1);//[1] [2,5,6]
2、當splice有兩個參數(shù)時(splice(m,n))枪眉,表示從m刪除n個元素捺檬,也就是說第一個參數(shù)代表某個位置,第二個是要刪除的個數(shù)贸铜。
var arr = [1,2,5,6];
var arr1 = arr.splice(1,2);
console.log(arr,arr1);//[1,6] [2,5]
說明:如果第一個參數(shù)為負數(shù)時(splice(-m,n))堡纬,表示從右往左數(shù)到m個位置,并從m位置向右刪除n個元素蒿秦,返回刪除的元素組成的數(shù)組烤镐。
var arr = [1,2,5,6];
var arr1 = arr.splice(-2,2);
console.log(arr,arr1);//[1,2] [5,6]
3、當splice有三個參數(shù)時(splice(m,n,k)),表示從m位置刪除n個元素之后棍鳖,插入k炮叶,k不止一個,可能有多個渡处。
var arr = [1,2,5,6];
var arr1 = arr.splice(1,arr.length,0,-1,-2)镜悉;//表示從數(shù)組下標為1的元素一直刪除到數(shù)組末尾,再將0,-1,-2插進去医瘫。
console.log(arr,arr1);//[1,0,-1,-2] [2,5,6]
注意:var arr1 = arr.splice(0)
將一個數(shù)組的所有元素轉(zhuǎn)移到另一個數(shù)組侣肄,不是復(fù)制。
var arr1 = arr.splice()
沒有刪除返回空數(shù)組
說明:此方法的重構(gòu)作為練習(xí)醇份,通過1稼锅、2、3三部分相信我講的應(yīng)該夠清楚僚纷,按照所列舉的功能依次判斷去實現(xiàn)它缰贝,不過呢如果有同學(xué)通過我寫的思路還是構(gòu)造不出來的話,下方留言畔濒,第一時間會回復(fù)哦剩晴。
8、slice
8.1含義:1侵状、當參數(shù)只有一個時slice(m)赞弥,表示從從下標為m的元素一直截取到數(shù)組末尾,改變原數(shù)組趣兄,返回截取到的元素組成的修數(shù)組绽左。
var arr = [1,2,5,6];
var arr1 = arr.slice(1);
console.log(arr,arr1);//[1] [2,5,6]
2、當有兩個參數(shù)時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()
//復(fù)制原數(shù)組到新數(shù)組,沒有引用關(guān)系
var arr1 = arr.slice(0)
//復(fù)制數(shù)組
8.2重構(gòu)
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:原意是指某些改含,在這里的含義是當數(shù)組中的元素有滿足條件的就返回true情龄,否則就返回false;
var arr = [1,2,5,6];
var arr1 = arr.some(function(item){
return item>2;
})
console.log(arr1);//true
9.2every:原意是指每一個捍壤,在這里的含義是當數(shù)組中的所有元素滿足條件的就返回true骤视,否則就返回false;
var arr = [1,2,5,6];
var arr1 = arr.every(function(item){
return item>2;
})
console.log(arr1);//false
重構(gòu)some(使用橋接模式),every重構(gòu)和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含義:如果只有一個參數(shù)時,就查找該元素的索引盗扇,如果找到則返回該元素所在的下標笼裳,沒找到則返回-1;
var arr = [1,2,5,6];
var index = arr.indexOf(1);
console.log(index);//0
如果只有二個參數(shù)時(indexOf(m,n))粱玲,查找m元素的索引,不過是從下標為n的元素開始查找拜轨,如果找到則返回該元素所在的下標抽减,沒找到則返回-1;
var arr = [1,2,5,6];
var index = arr.indexOf(1橄碾,2);
console.log(index);//-1 找不到
重構(gòu)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有三個參數(shù)史汗,fill(m,n,k),m是要填充的值,n是起始位置拒垃,k是結(jié)束位置停撞,如果不給開始位置和結(jié)束位置,就會全部填充覆蓋悼瓮。
var arr = Array(6).fill(10)
var arr = Array(6).fill({a:1})
注意:fill只能用于有長度的數(shù)組戈毒,而且如果填充的元素是對象時,是有引用關(guān)系的横堡,當改變其中一個元素時埋市,其它的都會變,例子可以自己寫寫看命贴。
12道宅、
12.1 forEach
arr.forEach(function(item,index,arr){})食听;
有三個參數(shù):item是數(shù)組中的每一個元素,index是數(shù)組元素的下標污茵,arr就是原數(shù)組樱报。
遍歷數(shù)組時,forEach相比較for循環(huán)來說不會遍歷到空元素省咨,相比較for-in不會遍歷到數(shù)組的屬性肃弟,有同學(xué)可能會問數(shù)組也有屬性?對的零蓉,數(shù)組也是對象笤受。
12.2 map
arr.map(function(item,index){})
說明:將滿足條件的元素形成一個新數(shù)組,使用return返回敌蜂,并且新數(shù)組的長度和原數(shù)組相同箩兽。
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 返回的是滿足條件的值組成的數(shù)組
reduce:reduce有四個參汗贫,value如果不給初始值,那么value就是數(shù)組的第一個元素秸脱,并且遍歷數(shù)組時會從下標為1的元素開始落包;如果value有初始值,那么數(shù)組將會從第一個元素開始遍歷摊唇。
//計算數(shù)組元素的和
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;
})
//找數(shù)組中元素的最大值或最小值咐蝇。
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完成數(shù)組去重
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會使得數(shù)組變?yōu)樗缮⑿徒Y(jié)構(gòu),什么是松散型我會在后面講解岛请。
以上有不足的旭寿,還請指正!