數(shù)組的方法
arr.slice(start帚呼,end)
按指定位置截取復(fù)制數(shù)組的內(nèi)容,返回新數(shù)組经磅,不會改變原數(shù)組
從下標(biāo)start開始名惩,截取到end澎胡,包括start但不包括end
第二個參數(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,查詢到第一個后巢株,就返回下標(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}); ?? ?//?這是錯誤得,查找不到那槽,因為查找得是新對象 ?地址不同
Array.from(類似于數(shù)組的列表)??轉(zhuǎn)為數(shù)組
//?根據(jù)標(biāo)簽名獲取到標(biāo)簽列表 (獲取到的是列表悼沿,不是數(shù)組,不能直接使用數(shù)組的方法)
var?divs=document.getElementsByTagName("div");
divs.pop()骚灸; //錯誤糟趾,不是數(shù)組不能直接使用數(shù)組的方法
var?arr=Array.from(divs); //ES6?的寫法 ?把divs這個列表 轉(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ào)用得函數(shù)中,this就是被點擊得元素(不精準(zhǔn)得)
????????????var?index=arr.indexOf(this);
????????????console.log(index);? //?這樣就可以判斷點擊得是列表中得第幾個元素??
????????}
------------使用 indexOf 查詢到數(shù)組中所有的為3的元素
???????var?arr=[1,3,1,2,3,5,2,3,4,6];
???????var?index=arr.indexOf(3); // 這樣 只能查詢到第一個3 (下標(biāo)為1)
???????console.log(index);
???????var?index=arr.indexOf(3,2); // 這樣 只能查詢到第二個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; // 查詢到最后,查不到時返回-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 ] , 表示這個元素不在arr1 數(shù)組中
????????????????arr1.push(arr[i]); // 那么將這個元素插入到arr1 數(shù)組中
????????????}
????????}
????????console.log(arr1);?
遍歷數(shù)組(forEach 和 map)
?arr.forEach(function(數(shù)組中的元素,每個元素對應(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會返回一個與原數(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?就是在對應(yīng)的下標(biāo)中添加對應(yīng)的數(shù)據(jù)
????????});
????????console.log(arr2);
forEach沒有返回值劫笙,使用return無效
map 有返回值,與原數(shù)組等長的新數(shù)組星岗,元素內(nèi)容由return確定填大,不寫return返回undefined
forEach 和 map 都不會遍歷空元素??
// 遍歷數(shù)組arr,將大于4的元素生成一個新的數(shù)組(新數(shù)組中會有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=[ // 元素是對象的數(shù)組
????????????{id:1001,name:"電視",price:4500},
????????????{id:1002,name:"電腦",price:6500},
????????????{id:1003,name:"冰箱",price:2000},
????????????{id:1004,name:"洗衣機",price:1000},
????????????{id:1005,name:"手機",price:5500}
????????];
// 使用 forEach 實現(xiàn)給數(shù)組添加 數(shù)量和總價屬性及值
?????? ?????arr.forEach(function(item){ // 遍歷 arr 數(shù)組俏橘,給元素添加 num 屬性
????????????item.num=parseInt(Math.random()*9+1); // 給num屬性賦值 隨機數(shù) 1-10
????????????item.total=item.price*item.num; // 給元素添加 total屬性 ?屬性值為 單價*數(shù)量
????????})
????????console.log(arr);
// 使用 map 實現(xiàn)給數(shù)組添加 數(shù)量和總價屬性及值
?????? ?????var?arr1=arr.map(function(item){ // 創(chuàng)建一個遍歷 arr1 承接map遍歷后 返回的數(shù)組
????????????item.num=parseInt(Math.random()*9+1);
????????????item.total=item.price*item.num;
????????????return?item; // 給每個map遍歷的元素添加內(nèi)容允华,item
????????})
????????console.log(arr1,arr);? // 每個元素都是對象 ?有引用關(guān)系,會改變原數(shù)組
???//?不改變原數(shù)組寥掐,完成一個新數(shù)組例获,里面有num和總價
????????var?arr1=arr.map(function(item){
????????????var?o={};
????????????for(var?prop?in?item){ // 把對象元素 復(fù)制出來 給到o ???
????????????????o[prop]=item[prop]; // 在將o對象當(dāng)作arr1數(shù)組中的元素 ?切斷通過遍歷過來的元素對象的引用關(guān)系
????????????}
????????????o.num=parseInt(Math.random()*9+1);
????????????o.total=o.price*o.num;
????????????return?o;
????????})
????????console.log(arr1,arr);
時間復(fù)雜度算法計算花費時間??花時間越少時間復(fù)雜度越小
空間復(fù)雜度算法計算需要花費堆棧空間(內(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 比較 滿足條件 進行交換
????????????????????????arr[j+1]=arr[j];
????????????????????????arr[j]=temp;
????????????????????}
????????????????}
????????????}
????????}
????????sorts(arr);
????????console.log(arr);?
arr.sort(); ???? 排序曹仗,僅能10以內(nèi)數(shù)字 ?缺點:按字符排序
arr.sort(function(后一項,前一項){}) ?僅適用于數(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項轉(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ù)組元素隨機亂序
????? ?return?Math.random()-0.5;
?});
arr.some(function(item,index,arr){??});
判斷數(shù)組中是否存在滿足條件的元素怎茫,如果有就返回true,如果沒有就返回false
遍歷數(shù)組,如果有一個滿足條件的元素轨蛤,都會直接返回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ù)組中是否每一個都滿足條件圃验,如果有一個不滿足條件,直接跳出缝呕,所有都滿足時返回為ture
var?bool=arr.every(function(item,index,arr){ // 判斷數(shù)組中 是否所有的元素都大于2
????????return?item>2;
});
console.log(bool);?