js數(shù)組常用方法QIan鋒逆戰(zhàn)

數(shù)組的方法


arr.slice(start,end)

按指定位置截取復(fù)制數(shù)組的內(nèi)容,返回新數(shù)組,不會(huì)改變原數(shù)組

從下標(biāo)start開始,截取到end,包括start但不包括end

第二個(gè)參數(shù)不寫,默認(rèn)截取到尾部,只能從前向后截取

var?arr1=arr.slice(1,4);??????? ?//?從第1位開始截取到第4位之前

var?arr1=arr.slice(); // 復(fù)制數(shù)組arr

var?arr1=arr.slice(0);? // 復(fù)制數(shù)組

var?arr1=arr.slice(3); //從第三位截取到尾部復(fù)制

var?arr1=arr.slice(-2); //從倒數(shù)第二位開始截取到尾部

var?arr1=arr.slice(-3,-1); //從倒數(shù)第三位到倒數(shù)第一位




arr.indexOf(要查詢得元素,從什么位置開始查詢)??位置就是下標(biāo)

在數(shù)組中查找元素,找到返回元素下邊,找不到返回-1,查詢到第一個(gè)后,就返回下標(biāo)不再繼續(xù)查詢

var??index=arr.indexOf(4); ?//?在數(shù)組中查找元素4,如果查找到,返回該元素所在的下標(biāo),如果沒有查找到,則返回-1


var?arr=[

??????{a:1},

??????{a:2},

??????{a:3},

???? ?{a:4}

];

var?index=arr.indexOf({a:1}); ?? ?//?這是錯(cuò)誤得,查找不到,因?yàn)椴檎业檬切聦?duì)象 ?地址不同




Array.from(類似于數(shù)組的列表)??轉(zhuǎn)為數(shù)組

//?根據(jù)標(biāo)簽名獲取到標(biāo)簽列表 (獲取到的是列表,不是數(shù)組,不能直接使用數(shù)組的方法)

var?divs=document.getElementsByTagName("div");

divs.pop(); //錯(cuò)誤,不是數(shù)組不能直接使用數(shù)組的方法

var?arr=Array.from(divs); //ES6?的寫法 ?把divs這個(gè)列表 轉(zhuǎn)為數(shù)組

?????? //ES5 ??=> ???var?arr=Array.prototype.slice.call(divs);



????????var?divs=document.getElementsByTagName("div");

????????var?arr=Array.from(divs);

????????for(var?i=0;i<arr.length;i++){

????????????arr[i].onclick=clickHandler;

????????}

????????function?clickHandler(){

????????????console.log(this); //?在點(diǎn)擊事件調(diào)用得函數(shù)中,this就是被點(diǎn)擊得元素(不精準(zhǔn)得)

????????????var?index=arr.indexOf(this);

????????????console.log(index);? //?這樣就可以判斷點(diǎn)擊得是列表中得第幾個(gè)元素??

????????}






------------使用 indexOf 查詢到數(shù)組中所有的為3的元素

???????var?arr=[1,3,1,2,3,5,2,3,4,6];

???????var?index=arr.indexOf(3); // 這樣 只能查詢到第一個(gè)3 (下標(biāo)為1)

???????console.log(index);

???????var?index=arr.indexOf(3,2); // 這樣 只能查詢到第二個(gè)3 (下標(biāo)為4)

???????console.log(index);


??????? var?index=0; // 使用循環(huán),查詢到數(shù)組中所有為3的元素,并打印下標(biāo)

????????while(true){

????????????index=arr.indexOf(3,index);

????????????console.log(index);

????????????if(index===-1)?break; // 查詢到最后,查不到時(shí)返回-1 ?如果為-1 跳出循環(huán),不再查詢

????????????index++;

????????}




lastIndexOf(查找得元素,從什么位置開始查找) ??從后向前查找

var?arr=[1,3,1,2,3,5,2,3,4,6];

var?index=arr.lastIndexOf(3);

console.log(index); // 打印下標(biāo) 7



—————————— ??第三種?去重??方法 ?———————————

????????var?arr=[1,3,1,2,3,5,2,3,4,6];

????????var?arr1=[];

????????for(var?i=0;i<arr.length;i++){

????????????if(arr1.indexOf(arr[i])===-1){ // 如果再arr1 數(shù)組中 查詢不到 arr [ i ] , 表示這個(gè)元素不在arr1 數(shù)組中

????????????????arr1.push(arr[i]); // 那么將這個(gè)元素插入到arr1 數(shù)組中

????????????}

????????}

????????console.log(arr1);?





遍歷數(shù)組(forEach 和 map)

?arr.forEach(function(數(shù)組中的元素,每個(gè)元素對(duì)應(yīng)的下標(biāo),數(shù)組自身){?})

???var?arr=[1,2,3,5,6,7,8,9];

???arr.forEach(function(a,b,c){

?????????console.log(a,b,c);

????????})



?//?求數(shù)組中所有元素的和

//??———使用for循環(huán)遍歷數(shù)組

??????? var?sum=0;

????????for(var?i=0;i<arr.length;i++){

????????????sum+=arr[i];

????????}

????????console.log(sum);?



????????//??———?forEach 遍歷數(shù)組

????????var?sum=0;

????????arr.forEach(function(item){

????????????sum+=item;

????????})

????????console.log(sum);?




var?arr=[1,2,3,5,,6,7,8,9];

?arr.forEach(function(item,index){ ?//?使用forEach可以跳過空元素

???????console.log(item,index);

????????})



????????var?arr1=[];

????????arr.forEach(function(item,index){ // 保留空元素

????????????arr1[index]=item;

????????})

????????console.log(arr1);?




arr.map(function(item,index,arr){ })

map會(huì)返回一個(gè)與原數(shù)組長度相等的新數(shù)組


????????var?arr=[3,5,7,9,1,2,4];

????????var?arr2=arr.map(function(item,index,arr){

????????????//?console.log(item,index,arr);

????????????//?return?"a";

????????????return?item+10; ?//?在map中使用return?就是在對(duì)應(yīng)的下標(biāo)中添加對(duì)應(yīng)的數(shù)據(jù)

????????});

????????console.log(arr2);



forEach沒有返回值,使用return無效

map 有返回值,與原數(shù)組等長的新數(shù)組,元素內(nèi)容由return確定,不寫return返回undefined

forEach 和 map 都不會(huì)遍歷空元素??




// 遍歷數(shù)組arr,將大于4的元素生成一個(gè)新的數(shù)組(新數(shù)組中會(huì)有undefined)

????? ? var?arr=[1,3,5,7,2,4,6,8];

????????var?arr1=arr.map(function(item){

????????????if(item>4){

????????????????return?item;

????????????}

????????});

????????console.log(arr1);?



????????var?arr=[ // 元素是對(duì)象的數(shù)組

????????????{id:1001,name:"電視",price:4500},

????????????{id:1002,name:"電腦",price:6500},

????????????{id:1003,name:"冰箱",price:2000},

????????????{id:1004,name:"洗衣機(jī)",price:1000},

????????????{id:1005,name:"手機(jī)",price:5500}

????????];

// 使用 forEach 實(shí)現(xiàn)給數(shù)組添加 數(shù)量和總價(jià)屬性及值

?????? ?????arr.forEach(function(item){ // 遍歷 arr 數(shù)組,給元素添加 num 屬性

????????????item.num=parseInt(Math.random()*9+1); // 給num屬性賦值 隨機(jī)數(shù) 1-10

????????????item.total=item.price*item.num; // 給元素添加 total屬性 ?屬性值為 單價(jià)*數(shù)量

????????})

????????console.log(arr);

// 使用 map 實(shí)現(xiàn)給數(shù)組添加 數(shù)量和總價(jià)屬性及值

?????? ?????var?arr1=arr.map(function(item){ // 創(chuàng)建一個(gè)遍歷 arr1 承接map遍歷后 返回的數(shù)組

????????????item.num=parseInt(Math.random()*9+1);

????????????item.total=item.price*item.num;

????????????return?item; // 給每個(gè)map遍歷的元素添加內(nèi)容,item

????????})

????????console.log(arr1,arr);? // 每個(gè)元素都是對(duì)象 ?有引用關(guān)系,會(huì)改變原數(shù)組



???//?不改變原數(shù)組,完成一個(gè)新數(shù)組,里面有num和總價(jià)

????????var?arr1=arr.map(function(item){

????????????var?o={};

????????????for(var?prop?in?item){ // 把對(duì)象元素 復(fù)制出來 給到o ???

????????????????o[prop]=item[prop]; // 在將o對(duì)象當(dāng)作arr1數(shù)組中的元素 ?切斷通過遍歷過來的元素對(duì)象的引用關(guān)系

????????????}

????????????o.num=parseInt(Math.random()*9+1);

????????????o.total=o.price*o.num;

????????????return?o;

????????})


????????console.log(arr1,arr);





時(shí)間復(fù)雜度算法計(jì)算花費(fèi)時(shí)間??花時(shí)間越少時(shí)間復(fù)雜度越小

空間復(fù)雜度算法計(jì)算需要花費(fèi)堆棧空間(內(nèi)存)越多代表空間復(fù)雜度越高



冒泡排序??????

???????? ???var?arr=[4,2,7,2,5,8,0,4,5,7,3,8,9];

????? ??????function?sorts(arr){

????????????var?len=arr.length-1;

????????????for(var?i=0;i<len;i++){? ?//?i?的目是控制循環(huán)次數(shù) ?

????????????????for(var?j=0;j<len-i;j++){ // ?j和j+1是前后數(shù)據(jù)比較

????????????????????if(arr[j]>arr[j+1]){

????????????????????????var?temp=arr[j+1]; // j 和 j+1 比較 滿足條件 進(jìn)行交換

????????????????????????arr[j+1]=arr[j];

????????????????????????arr[j]=temp;

????????????????????}

????????????????}

????????????}

????????}

????????sorts(arr);

????????console.log(arr);?



arr.sort(); ???? 排序,僅能10以內(nèi)數(shù)字 ?缺點(diǎn):按字符排序

arr.sort(function(后一項(xiàng),前一項(xiàng)){}) ?僅適用于數(shù)值


arr.sort(function(a,b){ ?????

????????return??a-b; //??從小到大???

????????return??b-a; // ?從大到小????


arr.sort(function(a,b){ // 將字符排序

?????????console.log(a.charCodeAt(0),b.charCodeAt(0)); // str.charCodeAt(0) => 將str字符串的第0項(xiàng)轉(zhuǎn)換為Unicode編碼

?????????return?a.charCodeAt(0)-b.charCodeAt(0); //?a-z

?????????return?b.charCodeAt(0)-a.charCodeAt(0); //?z-a

????????})



arr.sort(function(){ // 數(shù)組元素隨機(jī)亂序

????? ?return?Math.random()-0.5;

?});





arr.some(function(item,index,arr){??});

判斷數(shù)組中是否存在滿足條件的元素,如果有就返回true,如果沒有就返回false

遍歷數(shù)組,如果有一個(gè)滿足條件的元素,都會(huì)直接返回true,不繼續(xù)向后遍歷


var?arr=[1,4,6,2,7,9,0];

var?bool=arr.some(function(item,index,arr){ // 遍歷數(shù)組,是否存在大于5的元素

???????return?item>5;

});

console.log(bool);




????????//? 重構(gòu)some橋接模式

??????? ????function?somes(arr,fn){ ?//?fn就是回調(diào)函數(shù)

????????????for(var?i=0;i<arr.length;i++){

???????????????var?bool=fn(arr[i],i,arr); // 通過循環(huán)遍歷傳入的數(shù)組,并回調(diào)條件函數(shù) 將回調(diào)函數(shù)的返回值賦值給bool 并最終返回出去

???????????????if(bool)?return?true;

????????????}

????????????return?false;

????????}


???????var?b=somes(arr,abc);

???????function?abc(item,index,arr){

????????????return?item>5;

????????}

????????console.log(b);?


var?bool=arr.every(function(item,index,arr){??});

判斷數(shù)組中是否每一個(gè)都滿足條件,如果有一個(gè)不滿足條件,直接跳出,所有都滿足時(shí)返回為ture


var?bool=arr.every(function(item,index,arr){ // 判斷數(shù)組中 是否所有的元素都大于2

????????return?item>2;

});

console.log(bool);?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容