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

資訊專欄INFORMATION COLUMN

用好JS 原生API系列之?dāng)?shù)組

shenhualong / 2809人閱讀

摘要:函數(shù)的因為也擁有屬性,所以其被稱為類數(shù)組對象。方法數(shù)組的拼接,,指被拼接的對象數(shù)組,為數(shù)組。如果為負(fù),則將其視為,其中為數(shù)組的長度。而提供了數(shù)組反轉(zhuǎn)和排序來對數(shù)組進行重排序。用好原生,你的代碼將顯得干凈,有趣。

前言

最近工作做數(shù)據(jù)交互展示,常和數(shù)據(jù)打交道,而隨之而來的就是遇見后端傳來的各種各樣的數(shù)組,我需要用各式各樣的方法來變換這些數(shù)據(jù),來最好的展示這些數(shù)據(jù);很多東西久了沒用就容易忘,自己也是邊查邊用,這篇文章算是自己這一周學(xué)習(xí)的知識的總結(jié)。當(dāng)然你也可以打看MSDN查看更標(biāo)準(zhǔn)的敘述

數(shù)組原生的API

那些需要知道的特性:
1:數(shù)組在JS中是對象的一種,所以數(shù)組也是引用類型,所以操作時要小心,時刻記住你操作的不是一個普通類型;
2:每個數(shù)組都自帶一個length屬性,這個屬性很特別,可讀也可寫。JS函數(shù)的arguments因為也擁有l(wèi)ength屬性,所以其被稱為類數(shù)組對象。
這里不會提到所有的API,因為真的太多了。我只提我最近常用的,還有被人們常說的增刪查改。

API之增刪查改

我以前聽說增刪查改(CRUD),是sql語言。但有一次參加面試,面試官問:說說你知道的JS數(shù)組增刪查改,那數(shù)組的增刪查改是那些呢?說真的,當(dāng)時我一臉懵逼,我還以為數(shù)組還能用sql語句操作
增加:push,unshift,還有通常我們常用的arr[arr.length] = newChild;
首先我們有一個數(shù)組arr= [1,2,3,4,5,6]
push被稱為棧操作,即棧頂入,棧頂出,所以當(dāng)我們采用arr.push(7),得到的結(jié)果是arr= [1,2,3,4,5,6,7],其相對于arr[arr.length] = 7;
unshift和push相反,即棧底入,所以當(dāng)我們做和上面相似的操作,即arr.push(7),得到的結(jié)果是arr= [7,1,2,3,4,5,6]
至于arr.push(3.5)和arr.unshift(3,5)答案是多少,你可以自己親自嘗試一下;
刪除:pop(對應(yīng)push),arr.pop()操作后,arr是arr= [1,2,3,4,5];shift(對應(yīng)unshift),arr.shift()操作后,arr= [2,3,4,5,6];操作length,當(dāng)我們arr.length = 4操作后,得到 arr =[1,2,3,4];
這里提一句,使用delete arr[arr.length-1],并不能刪除最后一個元素,而只是將最后一個元素的賦值去除,值為undefined,且其length未變.
查:很多時候我們都采用for循環(huán)遍歷加比較,來查找某個元素在數(shù)組中的索引,但其實js是支持indexOf方法的,當(dāng)我們進行arr.indexOf(3),其會返回結(jié)果2,進行arr.indexOf(9),其返回的結(jié)果就是-1,和字符串的indexOf方法何其相似,所以也有相對應(yīng)的lastIndexOf()方法;
改:改在數(shù)組操作中很常用,也很直接,這個就不長述了。
這里說三個重要的方法concat,slice和splice,concat主要做數(shù)組拼接(我經(jīng)常用它做數(shù)組的深拷貝);slice主要做數(shù)組截取,而splice幾乎能完成上述所有的CUD操作,之所以要把他們分開提,是因為這兩個方法操作較復(fù)雜,其cancat與slice并不是對數(shù)組本身的操作,而是會產(chǎn)生一個新的Array數(shù)組,被操作的數(shù)組并沒有改變;而splice方法,是直接對數(shù)組進行操作,僅當(dāng)參數(shù)刪除或替換元素操作時,會返回一個新的數(shù)組,其包含的元素就是返回的元素。
concat方法:數(shù)組的拼接,array.concat([item1[, item2[, . . . [, itemN]]]]) ,array指被拼接的對象數(shù)組,item為數(shù)組。但我用的最多的就是數(shù)組的深拷貝,看實例:

var hege = ["Cecilie", "Lone"];
var stale = ["Emil", "Tobias", "Linus"];
var kai = ["Robin"];
var children = hege.concat(stale,kai);
console.log(children)  //打印["Cecilie", "Lone","Emil", "Tobias", "Linus","Robin"]
var deepArr = stale.concat([]);//數(shù)組深拷貝;
deepArr.push("Denzel"); 
console.log(deepArr); //打印["Emil","Tobias", "Linus","Denzel"]
console.log(stale); //打印["Emil", "Tobias", "Linus"];

slice方法:arrayObj.slice(start, [end]),從方法的描述可知,其可接受兩個參數(shù),start即截取開始的位置,end截取結(jié)束的位置,參數(shù)可選,如果沒有,截取的位置是直到數(shù)組末尾,但需要注意的是,start位置的元素是被截取的,而end位置的元素是不包含的,只截取該元素前一個元素。

var arr= [1,2,3,4,5,6]
var newArr = arr.slice(0,arr.length);
console.log(newArr)  //打印 [1,2,3,4,5,6]
newArr = arr.slice(3,5);
console.log(newArr)  //打印 [4,5]

其實前面都不復(fù)雜,復(fù)雜的是參數(shù)為負(fù)的時候,規(guī)則是這樣的(來源于MSDN):如果 start 為負(fù),則將其視為 length + start,其中 length 為數(shù)組的長度。如果 end 為負(fù),則將其視為 length + end,其中 length 為數(shù)組的長度。如果省略 end,則將一直提取到 arrayObj 的結(jié)尾。如果 end 出現(xiàn)在 start 之前,則不會將任何元素復(fù)制到新數(shù)組中。

var arr= [1,2,3,4,5,6]
var newArr = arr.slice(0,-1);
console.log(newArr)  //打印 [1,2,3,4,5]
newArr = arr.slice(-3,-1);
console.log(newArr)  //打印 [4,5]

splice方法:arrayObj.splice(start, deleteCount, [item1[, item2[, . . . [,itemN]]]]),相比slice,其復(fù)雜太多,所以幾乎能完成所有的cud操作,但與其不同的是,上面的方法都只能在數(shù)組的頭和尾上進行操作,splice能完成任意位置的cud操作;其arrayObj參數(shù)為必需,且必須是一個 Array 對象;start參數(shù)必需,指數(shù)組中移除元素操作的起點,從 0 開始,deleteCount參數(shù)必需,指要移除的元素的個數(shù),上面提到的返回數(shù)組,其數(shù)組元素的個數(shù)與deleteCount相等,當(dāng)deleteCount=0時,其返回一個空數(shù)組;item1, item2,. . ., itemN可選,指插入數(shù)組中代替已移除元素的元素。直接看實例吧:

let arr =[1,2,3,4,5,6]  //以下三步是獨立操作,非連續(xù)操作。偷了個小懶
arr.splice(2, 2, "11","12"); //這個操作刪除了3,4,并在其位置上添加了11,12,相當(dāng)于改,其結(jié)果[1, 2, "11", "12", 5, 6]

arr.splice(2,0, "11","12");//這個操作刪除了0個元素,添加了11,12,相當(dāng)于增,其結(jié)果[1, 2, "11", "12",3,4,5,6];

arr.splice(2,2, );//這個操作刪除了2個元素,添加了0個元素,相當(dāng)于刪,其結(jié)果[1, 2, "11", "12",3,4,5,6],相當(dāng)于增加;  

splice方法的start參數(shù)也支持負(fù)數(shù),其會自動類加length,直到為正。

API之重排序

說道數(shù)據(jù)處理,也許你利馬會想到排序,什么冒泡,差值,希爾,快速排序算法。而JS提供了reverse()數(shù)組反轉(zhuǎn)和sort()排序來對數(shù)組進行重排序。
數(shù)組反轉(zhuǎn)reverse():和其名字描述的一致,用于數(shù)組反轉(zhuǎn),需要注意的是,其是對數(shù)組本省的操作,并不會產(chǎn)生新數(shù)組;很簡單,看個示例就明白了:

var color =["a","b","e","d","c","f"];
color.reverse();
console.log(color);//打印[f,c,d,e,b,a]

數(shù)組排序sort():這里所說的排序,并不是狹義的有序排列,你可以利用這個方法把有序的數(shù)組進行無序排列,為啥?應(yīng)為sort()方法支持你自己寫比較函數(shù)。另外,在沒有比較函數(shù)的情況下,sort()方法是根據(jù)每個數(shù)組項的toString()后根據(jù)字典順序進行排序的;

var color =["a","b","e","d","c","f"];
color.sort();
console.log(color);//打印[a,b,c,d,e,f]   
var num =[1,3,2,12,24,5,7,19];
num.sort(); //這將證明上面提到的根據(jù)每個數(shù)組項的toString()后根據(jù)字典順序進行排序
console.log(num);//打印[1, 12, 19, 2, 24, 3, 5, 7]

如果你想讓上面的數(shù)據(jù)進行升序或者降序進行排序,你需要自己寫一個比較函數(shù),即這樣:

var num =[1,3,2,12,24,5,7,19];
num.sort(function(a,b){
    return a-b;
});   
console.log(num);//打印[1, 2, 3, 5, 7, 12, 19, 24]
num.sort(function ()  //讓有序變成亂序
{
    return Math.random()<0.5?1:-1;
});
console.log(num);//打印[3, 5, 2, 1, 7, 19, 12, 24]    
API之循環(huán)遍歷

也許你已習(xí)慣了for循環(huán),或者你對jquery的each方法已經(jīng)產(chǎn)生了依賴,或許你應(yīng)該接觸點新知識了,畢竟ES6已經(jīng)不算新了;ES7已經(jīng)開始被支持了;而你還不知道用ES5的map,some,every,filter來循環(huán)遍歷你的數(shù)組,甚至是forEach。
every():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)對每一項都返回true,則返回true;
some():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)任一項都返回true,則返回true;
所以,縱向看,其實every是所有項的&&操作,而some是||操作;
filter():對數(shù)組中的每一項運行給定函數(shù),返回該函數(shù)該返回true的項組成新的數(shù)組;
map():對數(shù)組中的每一項運行給定函數(shù),返回該函數(shù)該返回true的項組成新的數(shù)組;
forEach():功能類似于for循環(huán);
對于上面5個方法,都有類似的回調(diào)參數(shù)(item,index,array),試著從一個例子來了解他們,一個簡單的例子顯得有些蒼白。假如現(xiàn)在我們有這樣一個需求,已知某個四川省某個景區(qū)今日接待旅客總?cè)藬?shù)10000人,然后從購票信息獲取到前十名的省份和人數(shù),我們想計算這些省份每個所占比例,并把他們的人數(shù)用一個數(shù)組多帶帶保存下來,用來找最大值,最小值,我們試著不用for循環(huán)來解決這個問題;

var totle = 10000;
var data = [{name:"四川省",num:3000},
    {name:"重慶市",num:500},
    {name:"江西省",num:900},
    {name:"湖南省",num:600},
    {name:"陜西省",num:800},
    {name:"河北省",num:300},
    {name:"湖北省",num:400},
    {name:"北京市",num:600},
    {name:"云南省",num:400},
    {name:"湖南省",num:300}];
var tempArr = [];
data = data.map(function (item) {
    tempArr.push(item.num);
    item.percent = item.num/totle;
    return item;
})
console.log(tempArr); //[3000, 500, 900, 600, 800, 300, 400, 600, 400, 300]
console.log(data); //0:{name: "四川省", num: 3000, percent: 0.3} 1:{name: "重慶市", num: 500, percent: 0.05}......

短短四行代碼就完成了這兩個需求,如果我們只想要第2名到第9名的數(shù)據(jù)(即去掉一個最高分,去掉一個最低分)拿來做分析,所以根絕前面抽離出來的數(shù)組,我們再借助sort()和filter()來完成這個需求:

tempArr.sort(function (v1,v2) { // 降序排列
    return v2-v1;
});
var max = tempArr.shift(),min = tempArr.pop();
data=data.filter(function (item) {  //這個方法并沒有完全達(dá)到需求,這里只是演示filter的用法,你可以試著優(yōu)化這個函數(shù),來完成這個需求
    return (item.num!==max)&&(item.num!==min)
})
console.log(tempArr);  //體會一下shift和pop[900, 800, 600, 600, 500, 400, 400, 300]
console.log(data);   //0:{name: "重慶市", num: 500, percent: 0.05} 1:{name: "江西省", num: 900, percent: 0.09}打印出來,結(jié)果只剩下7個了,因為最小值出現(xiàn)了兩次。

通過上面兩個例子,也許你應(yīng)該已經(jīng)體會到了這些原生數(shù)組API的作用了,他們在數(shù)據(jù)處理中,優(yōu)勢非常大,但也不能說,以后就可以完全不依賴ofr循環(huán)了,還是很難,上面五個方法有一個通病,就是無法中止遍歷,即在循環(huán)中break,break一些遍歷查找中,還是相當(dāng)省時,這也是為啥有時我們還是需要for循環(huán)來做一些操作. 至于some,every,foreach,你可以自己動手感受一下。
別總是沉溺于已會的那點知識,別總依賴框架,插件。用好原生API,你的代碼將顯得干凈,有趣。

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

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

相關(guān)文章

  • 2017年1月前端月報

    摘要:平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個網(wǎng)址概況在線地址前端開發(fā)群月報提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發(fā)群月報 提交原則: 技...

    FuisonDesign 評論0 收藏0
  • 2017年1月前端月報

    摘要:平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個網(wǎng)址概況在線地址前端開發(fā)群月報提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發(fā)群月報 提交原則: 技...

    ivyzhang 評論0 收藏0
  • 2017年1月前端月報

    摘要:平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。年以前看這個網(wǎng)址概況在線地址前端開發(fā)群月報提交原則技術(shù)文章新的為主。 平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個網(wǎng)址:http://www.kancloud.cn/jsfron... 概況 在線地址:http://www.kancloud.cn/jsfront/month/82796 JS前端開發(fā)群月報 提交原則: 技...

    CloudwiseAPM 評論0 收藏0
  • 原生js練習(xí)題---第四課

    摘要:然而問題是,這個法則在導(dǎo)航條的主體是可行的但是子選單因為前面提到的三層嵌套構(gòu)造圓角,已經(jīng)無法減少嵌套了,同時還得考慮到子選單也是嵌套在導(dǎo)航條里的啊。。。同理,反過來進入子選單時自然就用來抵消達(dá)到篩選的目的。 0x1setTimeout應(yīng)用 實現(xiàn)效果:4-01setTimeout應(yīng)用 又見導(dǎo)航條,先看下css,這里用的是雪碧圖背景做出圓角的效果,雖然是經(jīng)典的方法、兼容性好,但這種代碼寫起...

    Snailclimb 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<