摘要:數(shù)組在中使用度非常頻繁,我總結了一些在數(shù)組中很常見的問題。否則返回語言類型返回數(shù)組中滿足提供的測試函數(shù)的第一個元素的索引。接受兩個參數(shù)和,代表需要截取的數(shù)組的開始序號和結束序號。其中表示添加的元素個數(shù)。
數(shù)組在javascript中使用度非常頻繁,我總結了一些在數(shù)組中很常見的問題。
關于數(shù)組中的方法非常多,我總結了一張表來大致了解數(shù)組中的方法
Array中的方法 | 含義 | 改變原數(shù)組 | 返回值 | ES6新增 |
---|---|---|---|---|
concat | 合并兩個或多個數(shù)組 | false | 新數(shù)組 | false |
copyWithin | 淺復制數(shù)組的一部分到同一數(shù)組中的另一個位置 | true | 改變后的數(shù)組 | true |
entries | 返回數(shù)組迭代器對象,該對象包含數(shù)組中每個索引的鍵/值對 | false | 數(shù)組迭代器 | true |
every | 測試數(shù)組的所有元素是否都通過了指定函數(shù)的測試 | false | 布爾值,true/false | false |
fill | 用一個固定值填充一個數(shù)組中從起始索引到終止索引內的全部元素 | true | 改變后的數(shù)組 | true |
filter | 創(chuàng)建一個新數(shù)組, 其包含通過所提供函數(shù)實現(xiàn)的測試的所有元素 | false | 新數(shù)組 | false |
find | 返回數(shù)組中滿足提供的測試函數(shù)的第一個元素的值。否則返回undefined | false | javascript語言類型 | true |
findIndex | 返回數(shù)組中滿足提供的測試函數(shù)的第一個元素的索引。否則返回-1 | false | 數(shù)組索引 | true |
forEach | 遍歷數(shù)組 | false | undefined | false |
includes | 判斷一個數(shù)組是否包含一個指定的值 | false | 布爾值,true/false | true |
indexOf | 返回在數(shù)組中可以找到一個給定元素的第一個索引,如果不存在,則返回-1 | false | 數(shù)組索引 | false |
join | 將數(shù)組(或一個類數(shù)組對象)的所有元素連接到一個字符串中 | false | 字符串 | false |
keys | Array迭代器,它包含數(shù)組中每個索引的鍵 | false | 數(shù)組迭代器 | true |
lastIndexOf | 返回指定元素在數(shù)組中的最后一個的索引,如果不存在則返回 -1 | false | 數(shù)組索引 | false |
map | 遍歷數(shù)組 | false | 新數(shù)組 | false |
pop | 從數(shù)組中刪除最后一個元素,并返回該元素的值 | true | 數(shù)組元素 | false |
push | 將一個或多個元素添加到數(shù)組的末尾,并返回新數(shù)組的長度 | true | 數(shù)組長度 | false |
reduce | 對累加器和數(shù)組中的每個元素(從左到右)應用一個函數(shù),將其減少為單個值 | false | 函數(shù)返回值 | false |
reduceRight | reduce執(zhí)行方向相反,從右到左 | false | 函數(shù)返回值 | false |
reverse | 將數(shù)組中元素的位置顛倒 | true | 改變后的數(shù)組 | false |
shift | 從數(shù)組中刪除第一個元素,并返回該元素的值 | true | 數(shù)組元素 | false |
slice | 可從已有的數(shù)組中返回選定的元素 | false | 新數(shù)組 | false |
some | 測試數(shù)組中的某些元素是否通過由提供的函數(shù)實現(xiàn)的測試 | false | 布爾值,true/false | false |
sort | 在適當?shù)奈恢脤?shù)組的元素進行排序 | true | 一個新數(shù)組 | false |
splice | 刪除現(xiàn)有元素和/或添加新元素來更改一個數(shù)組的內容 | true | 刪除的元素數(shù)組 | false |
toLocaleString | 返回一個字符串表示數(shù)組中的元素 | false | 字符串 | false |
toString | 返回一個字符串,表示指定的數(shù)組及其元素 | false | 字符串 | false |
unshift | 將一個或多個元素添加到數(shù)組的開頭 | true | 數(shù)組長度 | false |
values | 一個數(shù)組迭代器對象,該對象包含數(shù)組每個索引的值 | false | 數(shù)組迭代器 | true |
從這個表中我們要小心幾個方法,reverse和sort會改變原數(shù)組,并返回改變的新數(shù)組,push和unshift方法返回的是數(shù)組長度而不是數(shù)組,forEach方法返回的是undefined不是數(shù)組。
此外,我還需提一下slice和splice這兩個方法,說實話這兩個方法看起來很像,容易讓人搞混,最關鍵的是用到的頻率還蠻高的,這兩個方法就像字符串中substr和substring這兩個老兄弟,閑著沒事就喜歡去迷惑別人,本人就曾深深的被這兩個方法傷害過。
slice接受兩個參數(shù)start和end,代表需要截取的數(shù)組的開始序號和結束序號。
var arr = [4,3,5,8,9,6]; arr.slice(0) // [4,3,5,8,9,6],end可以省略,默認為數(shù)組長度 arr.slice(0,4) //[4,3,5,8] arr.slice(-1); //[6], start為負數(shù)代表從數(shù)組截取的開始序號從尾部算起 arr.slice(0,-1); //[4,3,5,8,9] end為負數(shù)表示結束序號從尾部算起 arr.slice(2,0); //[] arr.slice(-1,-1); //[] 如果start和end符號相同,end一定大于start,否則返回的會是[]
splice的參數(shù)為index,deleteCount和...items,index表示需要刪除或添加原數(shù)時的位置,負數(shù)表示從尾部算起,deleteCount表示要刪除的元素,0表示不刪除。其中items表示添加的元素個數(shù)。
var arr = [4,3,5,8,9,6]; arr.splice(0,0) //返回[], arr=[4,3,5,8,9,6]; arr.splice(0,2) //返回[4,3], arr=[5,8,9,6]; arr.splice(0,2,3,4) //返回[5,8], arr=[3,4,9,6];
splice不管是添加還是刪除元素,返回的都是刪除元素的列表,splice是先做刪除操作,后添加
var arr = [4,3,5]; arr.splice(3,1,8,9); //返回[], arr= [4, 3, 5, 8, 9]; //如果index大于數(shù)組長度,那么splice不會刪除元素
注意:雖然slice和splice都返回一個新的數(shù)組,但是slice不會改變原數(shù)組,splice會改變原數(shù)組,這個區(qū)別非常關鍵。
最后在加一些經常會問到的數(shù)組問題。
1.創(chuàng)建數(shù)組//數(shù)組字面量創(chuàng)建 var arr = [1,2]; //Array構造器創(chuàng)建; var arr = Array(1,2); //[1,2] 可以用new操作符,也可以不用 //Array構造器有個局限性,不能創(chuàng)建只有單個數(shù)字的數(shù)組 var arr = Array(10) //創(chuàng)建的是一個長度為10的空數(shù)組,并不是[10] //如果傳入的不是Number類型的數(shù)字,那么沒有任何問題 var arr = Array("10") //["10"] //此時如果要創(chuàng)建只有單個數(shù)字的數(shù)組,可以用Array.of方法 var arr = Array.of(10) //[10] var arr = Array.of(1,2) //[1,2] //Array.from( items [ , mapfn [ , thisArg ] ] ) //items是個可迭代對象,mapfn是遍歷該迭代對象的function,thisArg是mapfn中的this對象 var arr = Array.from([1,2,3]) //[1,2,3]
Array.from是非常有用的創(chuàng)建數(shù)組方法,能把字符串轉化為數(shù)組,Map,Set也能轉成數(shù)組。
Array.from("abc") //["a","b","c"]; Array.from(new Set([1,2,3])) //[1,2,3],當然這個例子毫無意義 Array.from(new Map([[1,2],[3,4]])) //[[1,2],[3,4]]
我們知道用Array構造器創(chuàng)建的數(shù)組是個空數(shù)組,map,forEach方法并不能遍歷這個數(shù)組。
var arr = Array(10); arr.forEach((item,index) => console.log(index)) //不會有輸出 //map,forEach循環(huán)判斷的是該對象上有沒有對應的屬性 arr.hasOwnProperty(0) //false,以hasOwnProperty為判斷標準 //Array.from中的mapfn方法是以迭代方式來判斷的,因此 Array.from(arr,(item,index)=>console.log(index)) //0,1,2,3,4,5,6,7,8,9
由于這個原因,我們可以快速對數(shù)組初始化,比如創(chuàng)建一個0到99的數(shù)組
Array.from(Array(100),(item,index)=>index); //當然,如果你用到上表中Array的keys方法那更快捷 Array.from(Array(100).keys());2.數(shù)組去重
方法一,創(chuàng)建對象的鍵值唯一性來進行去重:
var arr = [1,2,3,1,3,5,3,2]; var _arr = []; var obj = {}; arr.forEach(item => { if(!obj[item]){ _arr.push(item); obj[item] = true; } }) arr = _arr;
方法二,結合Set的鍵值唯一性以及Array.from方法可以快速數(shù)組去重:
var arr = Array.from(new Set([1,2,3,1,3,5,3,2])) //[1,2,3,5]3.快速復制一個數(shù)組
var arr = [1,2,3,4]; var arr1 = arr.slice(); var arr2 = arr.concat();
注:這里的復制指的是淺拷貝4.求數(shù)組最大值,最小值
這里的數(shù)組指的是全是數(shù)字的數(shù)組
方法一,sort排序后取值
var arr = [1,4,6,2,33,19,6,9]; var maxvalue = arr.sort((a,b) => b>a )[0] var minvalue = arr.sort((a,b) => a>b )[0]
方法二,Math的max和min方法調用
var arr = [1,4,6,2,33,19,6,9]; var maxvalue = Math.max.apply(null,arr); //33 var minvalue = Math.min.apply(null,arr); //15.數(shù)組排序
在不用系統(tǒng)自帶的sort的情況下對數(shù)組排序有很多方法,比如冒泡、插入以及快速排序等。但我總覺得這些排序方法還是過于復雜,有沒有更快以及更方便的排序,我思考了好久,后來先想到了可以用數(shù)組的序號進行排序。原理是把數(shù)組1中的值變成數(shù)組2中的序號:
var arr = [3,4,6,2,8,7,5], arr2 = []; arr.forEach(item => arr2[item] = item); arr = []; arr2.forEach(item => arr.push(item));
寫完之后自己感覺美滋滋,可之后發(fā)現(xiàn)如果數(shù)組中有負數(shù),不就都玩完了嗎。于是趕緊改:
var arr = [3,-4,6,-2,-8,7,5], parr = []; narr = []; arr.forEach(item => item>=0?parr[item] = item:narr[-item] = item); arr = []; parr.forEach(item => arr.push(item)); narr.forEach(item => arr.unshift(item));
注:如果數(shù)組中有重復數(shù)字則排序方法有誤,會把重復數(shù)字去掉。
寫完之后發(fā)現(xiàn)其實也沒有比冒泡、插入以及快速排序的方法快多少。
6.求一個整數(shù)數(shù)組是否包含另一個整數(shù)數(shù)組一開始我想到一個方法,把兩個數(shù)組轉換成字符串,在進行includes或者indexOf判斷就可以了,后來我發(fā)現(xiàn)了問題:
var a = [2,4,8,6,12,67,9]; var b = [8,6,12]; a.join(",").includes(b.join(",")); //true; 這是可以的 var b = [8,6,1] a.join(",").includes(b.join(",")); //true; 這居然也可以,顯然有問題 //于是改成 a.join(",").includes(","+b.join(",")+","); //false; //后來我又發(fā)現(xiàn)如果b數(shù)組在a數(shù)組的開頭和結尾都會有問題,于是又改成如下: (","+a.join(",")+",").includes(","+b.join(",")+","); //false;
寫這篇文章主要是對自己學習數(shù)組做一個總結。如果對上面的問題有更好的解答,歡迎留言告知。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92135.html
摘要:投射劇中人物對車禍妻子偷情肇事者死亡的真相聽而不聞視而不見閉嘴不言。想方設法把自己培養(yǎng)成工程師而不是最后成為了碼農查看更多列表回顧九月份第一周為什么你的前端工作經驗不值錢回顧九月份第二周前端你該知道的事兒回顧九月份第三周最近的資訊集合 原鏈接:http://bluezhan.me/weekly/#/9-3 1、web前端 JavaScript實現(xiàn)H5游戲斷線自動重連的技術 前端日報:...
摘要:投射劇中人物對車禍妻子偷情肇事者死亡的真相聽而不聞視而不見閉嘴不言。想方設法把自己培養(yǎng)成工程師而不是最后成為了碼農查看更多列表回顧九月份第一周為什么你的前端工作經驗不值錢回顧九月份第二周前端你該知道的事兒回顧九月份第三周最近的資訊集合 原鏈接:http://bluezhan.me/weekly/#/9-3 1、web前端 JavaScript實現(xiàn)H5游戲斷線自動重連的技術 前端日報:...
摘要:本篇文章將回顧學習種基本類型和及數(shù)據(jù)類型之間的轉化。如果不能,再調用對象的方法,再測試返回值是否可以被轉化為數(shù)值。首先可以用于任何數(shù)據(jù)類型,另外兩個則是專門用于把字符串轉換成數(shù)值。 概述 ECMAScript中有5中基本數(shù)據(jù)類型:Undefined,Null,Boolean,Number,String,還有一種復雜數(shù)據(jù)類型對象(Object),Object本質上是由一組無序的名值對組成...
閱讀 675·2021-09-30 09:47
閱讀 2869·2021-09-04 16:40
閱讀 853·2019-08-30 13:18
閱讀 3447·2019-08-29 16:22
閱讀 1551·2019-08-29 12:36
閱讀 583·2019-08-29 11:11
閱讀 1475·2019-08-26 13:47
閱讀 1128·2019-08-26 13:32