數(shù)組方法的使用和部分方法的重構(gòu)

就目前來說,數(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),什么是松散型我會在后面講解岛请。
以上有不足的旭寿,還請指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崇败,一起剝皮案震驚了整個濱河市盅称,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌后室,老刑警劉巖微渠,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咧擂,居然都是意外死亡逞盆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門松申,熙熙樓的掌柜王于貴愁眉苦臉地迎上來云芦,“玉大人俯逾,你說我怎么就攤上這事【艘荩” “怎么了桌肴?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琉历。 經(jīng)常有香客問我坠七,道長,這世上最難降的妖魔是什么旗笔? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任彪置,我火速辦了婚禮,結(jié)果婚禮上蝇恶,老公的妹妹穿的比我還像新娘拳魁。我一直安慰自己,他們只是感情好撮弧,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布潘懊。 她就那樣靜靜地躺著,像睡著了一般贿衍。 火紅的嫁衣襯著肌膚如雪授舟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天贸辈,我揣著相機與錄音释树,去河邊找鬼。 笑死裙椭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的署浩。 我是一名探鬼主播揉燃,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筋栋!你這毒婦竟也來了炊汤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤弊攘,失蹤者是張志新(化名)和其女友劉穎抢腐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體襟交,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡迈倍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捣域。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啼染。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡宴合,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迹鹅,到底是詐尸還是另有隱情卦洽,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布斜棚,位于F島的核電站阀蒂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弟蚀。R本人自食惡果不足惜蚤霞,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粗梭。 院中可真熱鬧争便,春花似錦、人聲如沸断医。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鉴嗤。三九已至斩启,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間醉锅,已是汗流浹背兔簇。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硬耍,地道東北人垄琐。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像经柴,于是被迫代替她去往敵國和親狸窘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349