成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

javascript中數(shù)組的回顧

gaomysion / 1092人閱讀

摘要:數(shù)組在中使用度非常頻繁,我總結(jié)了一些在數(shù)組中很常見的問題。否則返回語(yǔ)言類型返回?cái)?shù)組中滿足提供的測(cè)試函數(shù)的第一個(gè)元素的索引。接受兩個(gè)參數(shù)和,代表需要截取的數(shù)組的開始序號(hào)和結(jié)束序號(hào)。其中表示添加的元素個(gè)數(shù)。

數(shù)組在javascript中使用度非常頻繁,我總結(jié)了一些在數(shù)組中很常見的問題。

關(guān)于數(shù)組中的方法非常多,我總結(jié)了一張表來大致了解數(shù)組中的方法

Array中的方法 含義 改變?cè)瓟?shù)組 返回值 ES6新增
concat 合并兩個(gè)或多個(gè)數(shù)組 false 新數(shù)組 false
copyWithin 淺復(fù)制數(shù)組的一部分到同一數(shù)組中的另一個(gè)位置 true 改變后的數(shù)組 true
entries 返回?cái)?shù)組迭代器對(duì)象,該對(duì)象包含數(shù)組中每個(gè)索引的鍵/值對(duì) false 數(shù)組迭代器 true
every 測(cè)試數(shù)組的所有元素是否都通過了指定函數(shù)的測(cè)試 false 布爾值,true/false false
fill 用一個(gè)固定值填充一個(gè)數(shù)組中從起始索引到終止索引內(nèi)的全部元素 true 改變后的數(shù)組 true
filter 創(chuàng)建一個(gè)新數(shù)組, 其包含通過所提供函數(shù)實(shí)現(xiàn)的測(cè)試的所有元素 false 新數(shù)組 false
find 返回?cái)?shù)組中滿足提供的測(cè)試函數(shù)的第一個(gè)元素的值。否則返回undefined false javascript語(yǔ)言類型 true
findIndex 返回?cái)?shù)組中滿足提供的測(cè)試函數(shù)的第一個(gè)元素的索引。否則返回-1 false 數(shù)組索引 true
forEach 遍歷數(shù)組 false undefined false
includes 判斷一個(gè)數(shù)組是否包含一個(gè)指定的值 false 布爾值,true/false true
indexOf 返回在數(shù)組中可以找到一個(gè)給定元素的第一個(gè)索引,如果不存在,則返回-1 false 數(shù)組索引 false
join 將數(shù)組(或一個(gè)類數(shù)組對(duì)象)的所有元素連接到一個(gè)字符串中 false 字符串 false
keys Array迭代器,它包含數(shù)組中每個(gè)索引的鍵 false 數(shù)組迭代器 true
lastIndexOf 返回指定元素在數(shù)組中的最后一個(gè)的索引,如果不存在則返回 -1 false 數(shù)組索引 false
map 遍歷數(shù)組 false 新數(shù)組 false
pop 從數(shù)組中刪除最后一個(gè)元素,并返回該元素的值 true 數(shù)組元素 false
push 將一個(gè)或多個(gè)元素添加到數(shù)組的末尾,并返回新數(shù)組的長(zhǎng)度 true 數(shù)組長(zhǎng)度 false
reduce 對(duì)累加器和數(shù)組中的每個(gè)元素(從左到右)應(yīng)用一個(gè)函數(shù),將其減少為單個(gè)值 false 函數(shù)返回值 false
reduceRight reduce執(zhí)行方向相反,從右到左 false 函數(shù)返回值 false
reverse 將數(shù)組中元素的位置顛倒 true 改變后的數(shù)組 false
shift 從數(shù)組中刪除第一個(gè)元素,并返回該元素的值 true 數(shù)組元素 false
slice 可從已有的數(shù)組中返回選定的元素 false 新數(shù)組 false
some 測(cè)試數(shù)組中的某些元素是否通過由提供的函數(shù)實(shí)現(xiàn)的測(cè)試 false 布爾值,true/false false
sort 在適當(dāng)?shù)奈恢脤?duì)數(shù)組的元素進(jìn)行排序 true 一個(gè)新數(shù)組 false
splice 刪除現(xiàn)有元素和/或添加新元素來更改一個(gè)數(shù)組的內(nèi)容 true 刪除的元素?cái)?shù)組 false
toLocaleString 返回一個(gè)字符串表示數(shù)組中的元素 false 字符串 false
toString 返回一個(gè)字符串,表示指定的數(shù)組及其元素 false 字符串 false
unshift 將一個(gè)或多個(gè)元素添加到數(shù)組的開頭 true 數(shù)組長(zhǎng)度 false
values 一個(gè)數(shù)組迭代器對(duì)象,該對(duì)象包含數(shù)組每個(gè)索引的值 false 數(shù)組迭代器 true

從這個(gè)表中我們要小心幾個(gè)方法,reverse和sort會(huì)改變?cè)瓟?shù)組,并返回改變的新數(shù)組,push和unshift方法返回的是數(shù)組長(zhǎng)度而不是數(shù)組,forEach方法返回的是undefined不是數(shù)組。

此外,我還需提一下slice和splice這兩個(gè)方法,說實(shí)話這兩個(gè)方法看起來很像,容易讓人搞混,最關(guān)鍵的是用到的頻率還蠻高的,這兩個(gè)方法就像字符串中substr和substring這兩個(gè)老兄弟,閑著沒事就喜歡去迷惑別人,本人就曾深深的被這兩個(gè)方法傷害過。

slice接受兩個(gè)參數(shù)start和end,代表需要截取的數(shù)組的開始序號(hào)和結(jié)束序號(hào)。

var arr = [4,3,5,8,9,6];
arr.slice(0)    // [4,3,5,8,9,6],end可以省略,默認(rèn)為數(shù)組長(zhǎng)度
arr.slice(0,4)   //[4,3,5,8]
arr.slice(-1);   //[6],  start為負(fù)數(shù)代表從數(shù)組截取的開始序號(hào)從尾部算起
arr.slice(0,-1);  //[4,3,5,8,9]   end為負(fù)數(shù)表示結(jié)束序號(hào)從尾部算起
arr.slice(2,0);   //[]
arr.slice(-1,-1);   //[]  如果start和end符號(hào)相同,end一定大于start,否則返回的會(huì)是[]

splice的參數(shù)為index,deleteCount和...items,index表示需要?jiǎng)h除或添加原數(shù)時(shí)的位置,負(fù)數(shù)表示從尾部算起,deleteCount表示要?jiǎng)h除的元素,0表示不刪除。其中items表示添加的元素個(gè)數(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ù)組長(zhǎng)度,那么splice不會(huì)刪除元素

注意:雖然slice和splice都返回一個(gè)新的數(shù)組,但是slice不會(huì)改變?cè)瓟?shù)組,splice會(huì)改變?cè)瓟?shù)組,這個(gè)區(qū)別非常關(guān)鍵。

最后在加一些經(jīng)常會(huì)問到的數(shù)組問題。

1.創(chuàng)建數(shù)組
//數(shù)組字面量創(chuàng)建
var arr = [1,2];

//Array構(gòu)造器創(chuàng)建;
var arr = Array(1,2);     //[1,2]  可以用new操作符,也可以不用
//Array構(gòu)造器有個(gè)局限性,不能創(chuàng)建只有單個(gè)數(shù)字的數(shù)組
var arr = Array(10)       //創(chuàng)建的是一個(gè)長(zhǎng)度為10的空數(shù)組,并不是[10]
//如果傳入的不是Number類型的數(shù)字,那么沒有任何問題
var arr = Array("10")     //["10"]

//此時(shí)如果要?jiǎng)?chuàng)建只有單個(gè)數(shù)字的數(shù)組,可以用Array.of方法
var arr = Array.of(10)    //[10]
var arr = Array.of(1,2)   //[1,2]

//Array.from( items [ , mapfn [ , thisArg ] ] )
//items是個(gè)可迭代對(duì)象,mapfn是遍歷該迭代對(duì)象的function,thisArg是mapfn中的this對(duì)象
var arr = Array.from([1,2,3])    //[1,2,3]

Array.from是非常有用的創(chuàng)建數(shù)組方法,能把字符串轉(zhuǎn)化為數(shù)組,Map,Set也能轉(zhuǎn)成數(shù)組。

Array.from("abc")        //["a","b","c"];
Array.from(new Set([1,2,3]))  //[1,2,3],當(dāng)然這個(gè)例子毫無意義
Array.from(new Map([[1,2],[3,4]]))  //[[1,2],[3,4]]

我們知道用Array構(gòu)造器創(chuàng)建的數(shù)組是個(gè)空數(shù)組,map,forEach方法并不能遍歷這個(gè)數(shù)組。

var arr = Array(10);
arr.forEach((item,index) => console.log(index))   //不會(huì)有輸出
//map,forEach循環(huán)判斷的是該對(duì)象上有沒有對(duì)應(yīng)的屬性
arr.hasOwnProperty(0)            //false,以hasOwnProperty為判斷標(biāo)準(zhǔn)
//Array.from中的mapfn方法是以迭代方式來判斷的,因此
Array.from(arr,(item,index)=>console.log(index))   //0,1,2,3,4,5,6,7,8,9

由于這個(gè)原因,我們可以快速對(duì)數(shù)組初始化,比如創(chuàng)建一個(gè)0到99的數(shù)組

Array.from(Array(100),(item,index)=>index);
//當(dāng)然,如果你用到上表中Array的keys方法那更快捷
Array.from(Array(100).keys());
2.數(shù)組去重

方法一,創(chuàng)建對(duì)象的鍵值唯一性來進(jìn)行去重:

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;

方法二,結(jié)合Set的鍵值唯一性以及Array.from方法可以快速數(shù)組去重:

var arr = Array.from(new Set([1,2,3,1,3,5,3,2]))   //[1,2,3,5]
3.快速?gòu)?fù)制一個(gè)數(shù)組
var arr = [1,2,3,4];
var arr1 = arr.slice();
var arr2 = arr.concat();
注:這里的復(fù)制指的是淺拷貝
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方法調(diào)用

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);   //1
5.數(shù)組排序

在不用系統(tǒng)自帶的sort的情況下對(duì)數(shù)組排序有很多方法,比如冒泡、插入以及快速排序等。但我總覺得這些排序方法還是過于復(fù)雜,有沒有更快以及更方便的排序,我思考了好久,后來先想到了可以用數(shù)組的序號(hào)進(jìn)行排序。原理是把數(shù)組1中的值變成數(shù)組2中的序號(hào):

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ù)組中有負(fù)數(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ù)組中有重復(fù)數(shù)字則排序方法有誤,會(huì)把重復(fù)數(shù)字去掉。

寫完之后發(fā)現(xiàn)其實(shí)也沒有比冒泡、插入以及快速排序的方法快多少。

6.求一個(gè)整數(shù)數(shù)組是否包含另一個(gè)整數(shù)數(shù)組

一開始我想到一個(gè)方法,把兩個(gè)數(shù)組轉(zhuǎn)換成字符串,在進(jìn)行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ù)組的開頭和結(jié)尾都會(huì)有問題,于是又改成如下:

(","+a.join(",")+",").includes(","+b.join(",")+",");  //false;

寫這篇文章主要是對(duì)自己學(xué)習(xí)數(shù)組做一個(gè)總結(jié)。如果對(duì)上面的問題有更好的解答,歡迎留言告知。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92135.html

相關(guān)文章

  • 回顧九月份第三周】 最近JavaScript資訊集合

    摘要:投射劇中人物對(duì)車禍妻子偷情肇事者死亡的真相聽而不聞視而不見閉嘴不言。想方設(shè)法把自己培養(yǎng)成工程師而不是最后成為了碼農(nóng)查看更多列表回顧九月份第一周為什么你的前端工作經(jīng)驗(yàn)不值錢回顧九月份第二周前端你該知道的事兒回顧九月份第三周最近的資訊集合 原鏈接:http://bluezhan.me/weekly/#/9-3 1、web前端 JavaScript實(shí)現(xiàn)H5游戲斷線自動(dòng)重連的技術(shù) 前端日?qǐng)?bào):...

    iKcamp 評(píng)論0 收藏0
  • 回顧九月份第三周】 最近JavaScript資訊集合

    摘要:投射劇中人物對(duì)車禍妻子偷情肇事者死亡的真相聽而不聞視而不見閉嘴不言。想方設(shè)法把自己培養(yǎng)成工程師而不是最后成為了碼農(nóng)查看更多列表回顧九月份第一周為什么你的前端工作經(jīng)驗(yàn)不值錢回顧九月份第二周前端你該知道的事兒回顧九月份第三周最近的資訊集合 原鏈接:http://bluezhan.me/weekly/#/9-3 1、web前端 JavaScript實(shí)現(xiàn)H5游戲斷線自動(dòng)重連的技術(shù) 前端日?qǐng)?bào):...

    vvpvvp 評(píng)論0 收藏0
  • 正則與JS正則

    摘要:注意本文將正則與中的正則分開討論。正則零寬斷言更多參考各種語(yǔ)言對(duì)于正則不同支持參考單行模式與多行模式通過設(shè)置正則表達(dá)式后的修飾符可開啟對(duì)應(yīng)的匹配模式單行模式和多行模式。 最近這段時(shí)間幫同學(xué)處理一些文檔, 涉及到一些結(jié)構(gòu)化文檔的工作大部分都得使用正則表達(dá)式, 之前對(duì)于正則的認(rèn)識(shí)大多來源于語(yǔ)言書上那幾頁(yè)的介紹, 自己也沒有用過幾次。這里將我之前感到模糊的概念作個(gè)整理。因?yàn)閷?duì)JS了解多點(diǎn),所...

    firim 評(píng)論0 收藏0
  • JavaScript回顧學(xué)習(xí):數(shù)據(jù)類型

    摘要:本篇文章將回顧學(xué)習(xí)種基本類型和及數(shù)據(jù)類型之間的轉(zhuǎn)化。如果不能,再調(diào)用對(duì)象的方法,再測(cè)試返回值是否可以被轉(zhuǎn)化為數(shù)值。首先可以用于任何數(shù)據(jù)類型,另外兩個(gè)則是專門用于把字符串轉(zhuǎn)換成數(shù)值。 概述 ECMAScript中有5中基本數(shù)據(jù)類型:Undefined,Null,Boolean,Number,String,還有一種復(fù)雜數(shù)據(jù)類型對(duì)象(Object),Object本質(zhì)上是由一組無序的名值對(duì)組成...

    youkede 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<