2019-08-26JavaScript數(shù)組方法總結(jié)

昨天參加了字節(jié)跳動(dòng)的筆試依鸥,總共4道編程題。哎悼沈!一言難盡贱迟,算法渣渣姐扮,4道編程題全軍覆沒。
經(jīng)過反思總結(jié)关筒,我覺得自己的算法已經(jīng)到了無藥可救的地步溶握,繼續(xù)下去只是浪費(fèi)時(shí)間。遂放棄算法那一塊知識(shí)蒸播,專攻前端基礎(chǔ),就算算法不行萍肆,我希望我能用掌握好基礎(chǔ)知識(shí)袍榆,感動(dòng)面試官們!繼續(xù)學(xué)習(xí)算法塘揣,我怕我到時(shí)候算法沒學(xué)好包雀,基礎(chǔ)也沒打牢固,面試官左右都不滿意亲铡!

一才写、 將數(shù)組轉(zhuǎn)為字符串

涉及到的方法有 toString(),join([parameter])

(一) toString()

toString()方法奖蔓,所有的對(duì)象都有這個(gè)方法赞草。

  • 參數(shù):無
  • 返回值:數(shù)組值(逗號(hào)分隔)的字符串
  • 是否改變?cè)瓟?shù)據(jù):否
  • 原理:
    分隔符為 逗號(hào)
    Boolean 的數(shù)組值 返回 字符串類型的 true 或者 false
    Number 的數(shù)組值 返回 字符串類型的對(duì)應(yīng)數(shù)字
    null和undefined 的數(shù)組值 返回 空串
    Object 的數(shù)組值 返回 字符串[Object Object]
    var arr = [1,3,"45", {id: "23"}, null, undefined, true,[1,2,3]];
    console.log(arr.toString());
    console.log(arr);
image.png

JS中各種數(shù)據(jù)類型調(diào)用toString():

  • Boolean類型的 toString() 返回 字符串類型的 true 或者 false
  • Number 類型的 toString() 兩種模式,即默認(rèn)模式和基模式(此時(shí)吆鹤,toString()可以傳入一個(gè)參數(shù)表示數(shù)值的進(jìn)制)
  • null和undefined沒有toString()厨疙,調(diào)用時(shí)會(huì)報(bào)錯(cuò)。
    undefined 實(shí)際上是從值 null 派生來疑务,null常用于表示一個(gè)為空的對(duì)象
    typeof null 返回 object ?? typeof undefined 返回 undefined
image.png

(二)join()

join([param1])

  • 參數(shù):String類型沾凄,可選參數(shù)
  • 返回值:
    有param1:數(shù)組值(param1分隔)的字符串
    無param1:數(shù)組值(逗號(hào)分隔)的字符串
  • 是否改變?cè)瓟?shù)據(jù):否
  • 原理:
    分隔符為 param1 或者 逗號(hào)
    Boolean 的數(shù)組值 返回 字符串類型的 true 或者 false
    Number 的數(shù)組值 返回 字符串類型的對(duì)應(yīng)數(shù)字
    null和undefined 的數(shù)組值 返回 空串
    Object 的數(shù)組值 返回 字符串[Object Object]

二、數(shù)組的基本操作

主要指增刪查改

(一)通過索引號(hào)

實(shí)現(xiàn)增刪查改所有操作

(二)push()知允,pop()

實(shí)現(xiàn) 類似于棧的 出棧撒蟀,入棧 操作
數(shù)組的尾部進(jìn)行 添加 或者 刪除 操作。

push([param1], [param2],......,[param n])

在數(shù)組尾部添加多個(gè)元素(0……n)

  • 參數(shù):可選參數(shù)温鸽,任意類型
  • 返回值:返回操作完之后保屯,數(shù)組的length屬性值
  • 是否改變?cè)瓟?shù)據(jù):是,就是在原數(shù)據(jù)上操作
  • 原理:
pop()

刪除最后一個(gè)元素

  • 參數(shù):無
  • 返回值:返回刪除的元素值
  • 是否改變?cè)瓟?shù)據(jù):是
  • 原理:
例子:
    var arr = [1,3,4];
    console.log(arr.pop());
    console.log("arr", arr);
    console.log(arr.push(2,5,0));
    console.log("arr", arr);
image.png

(三)shift()嗤朴,unshift()

實(shí)現(xiàn)類似于隊(duì)列的入隊(duì)配椭,出隊(duì)操作
數(shù)組的頭部進(jìn)行 刪除 或者 添加 操作

unshift([param1], [param2],......,[param n])

在數(shù)組頭部添加多個(gè)新元素(0……n),并“反向位移”舊元素

  • 參數(shù):可選參數(shù)雹姊,任意類型
  • 返回值:返回操作完之后股缸,數(shù)組的length屬性值
  • 是否改變?cè)瓟?shù)據(jù):是
  • 原理:
shift()

刪除數(shù)組的第一個(gè)元素,并“位移”其他元素

  • 參數(shù):無
  • 返回值:返回操作完之后吱雏,數(shù)組的length屬性值
  • 是否改變?cè)瓟?shù)據(jù):是
  • 原理:
例子
    var arr = [1,3,4];
    console.log("arr", arr);
    console.log(arr.shift());
    console.log("arr", arr);
    console.log(arr.unshift(2,5,0));
    console.log("arr", arr);
image.png

(四)splice()

splice(index敦姻,count瘾境,[param1],[param2],……,[param n])

拼接數(shù)組镰惦,可能位移其他元素迷守。
可實(shí)現(xiàn)數(shù)組的增刪改

  • 參數(shù):
    index:>= 0,表示新元素應(yīng)該被添加(接入)的索引值,
    count:>= 0旺入,表示應(yīng)刪除多少元素
    可選參數(shù):任意類型兑凿,表示要添加的新元素
  • 返回值:已刪除項(xiàng)組成的數(shù)組
  • 是否改變?cè)瓟?shù)據(jù):是
splice實(shí)現(xiàn)增刪改

增:count = 0,定義要添加的新元素
splice(index, \color{red}{0 }, param1茵瘾,param2,……,param n)
刪:count > 0礼华,不定義要添加的新元素
splice(index, \color{red}{ count }),刪除count個(gè)元素
改:count > 0拗秘,定義要添加的新元素
splice(index, \color{red}{count, param1, param2,……, param n}

    var arr = [1,3,4,5,6,7];
    console.log("arr", arr);
    var deleteArr = [];
    arr.splice(2,0,"we","our"); // 從索引值 2 開始圣絮,刪除0位元素,拼接新元素
    console.log("增", arr);
    arr.splice(0,2); // 從索引值 0 開始雕旨,刪除兩位元素
    console.log("刪", arr);
    deleteArr = arr.splice(2,1,"edit");
    console.log("改", arr);
    console.log("刪除的數(shù)據(jù)項(xiàng)", deleteArr);
image.png

(五)delete 運(yùn)算符

任一索引處的元素扮匠,改為 undefined,會(huì)在數(shù)組留下未定義的空洞凡涩,不推薦使用
不涉及位移

三棒搜、數(shù)組的其他操作

主要指 合并,裁剪 等操作突照。

(一)concat()

concat(param1, param2, ……, paramn)

合并(連接)數(shù)組帮非,區(qū)別于 拼接

  • 參數(shù):數(shù)組類型
  • 返回值:返回操作完之后,新的數(shù)組
  • 是否改變?cè)瓟?shù)據(jù):否
    var arr = [1,3,4,5,6,7];
    var arr2 = [8,9,10,11];
    var concatArr = arr.concat(arr2);
    console.log("arr", arr);
    console.log("arr2", arr2);
    console.log("concatArr", concatArr);
如果需要arr2在前面讹蘑,則arr2.concat(arr)就可以了

(二) slice()

slice( start末盔,end ) : 裁剪數(shù)組
從start開始,直到end(不包括)為止

  • 參數(shù): >= 0
  • 返回值:返回裁剪出來的數(shù)組
  • 是否改變?cè)瓟?shù)據(jù):否
    var arr = [1,3,4,5,6,7];
    var sliceArr = arr.slice(2,10);
    console.log("arr", arr);
    console.log("sliceArr", sliceArr);
image.png

四座慰、數(shù)組的排序類操作

主要指 排序陨舱,反轉(zhuǎn),查找最大版仔,查找最小 等操作

(一)sort()

首先明確游盲,排序指的是對(duì) 數(shù)字 或者是 字符 排序
sort([sortby])

  • 參數(shù):
    sortby:比較函數(shù) ,規(guī)定排序順序
    無參數(shù):按照字符編碼的順序進(jìn)行排序蛮粮。先把數(shù)組的元素都轉(zhuǎn)換成字符串(如有必要)益缎,再比較。
  • 返回值:數(shù)組的引用
  • 是否改變?cè)瓟?shù)據(jù):是

比較函數(shù):
該函數(shù)要比較兩個(gè)值然想,然后返回一個(gè)用于說明這兩個(gè)值的相對(duì)順序的數(shù)字莺奔。
比較函數(shù)應(yīng)該具有兩個(gè)參數(shù) a 和 b,其返回值如下:
??1.若 a 小于 b变泄,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前令哟,則返回一個(gè)小于 0 的值恼琼。
??2. 若 a 等于 b,則返回 0屏富。
??3.若 a 大于 b晴竞,則返回一個(gè)大于 0 的值。

數(shù)組排序
    var arr = [11,3,14,5,6,7];
    console.log("arr", arr);
    arr.sort();
    console.log("未規(guī)定按數(shù)值從小到大排序", arr);
    arr.sort(sortNumber);
    console.log("規(guī)定按數(shù)值從小到大排序", arr);
    function sortNumber(a, b){
        return a - b;
    }
正確的按數(shù)值排序了
對(duì)象數(shù)組排序

JavaScript 數(shù)組狠半,經(jīng)常會(huì)包含對(duì)象噩死,對(duì)象擁有不同數(shù)據(jù)類型的屬性,sort() 方法怎么對(duì)對(duì)象數(shù)組排序呢神年?——通過比較函數(shù)對(duì)比(數(shù)字甜滨,字符串)屬性的屬性值,從而排序

var cars = [
    {type:"Volvo", year:2016},
    {type:"Saab", year:2001},
    {type:"BMW", year:2010}
];
//比較數(shù)值屬性
cars.sort(function(a, b){return a.year - b.year});
//比較字符串屬性
cars.sort(function(a, b){
      var x = a.type.toLowerCase();
      var y = b.type.toLowerCase();
      if (x < y) {return -1;}
      if (x > y) {return 1;}
      return 0;
});

(二)reverse()

反轉(zhuǎn)數(shù)組

  • 參數(shù):無參數(shù)
  • 返回值:數(shù)組的引用
  • 是否改變?cè)瓟?shù)據(jù):是

(三) 查找最值

JavaScript 數(shù)組 沒有 查找最高和最低值的 內(nèi)建函數(shù)瘤袖。

通過排序函數(shù)

可通過對(duì)數(shù)組進(jìn)行排序,然后使用索引來獲得最高或最低值昂验。

Math.max() 捂敌, Math.min()
    var arr = [11,2,3];
    var max = Math.max.apply(null,arr); // 11
    var min = Math.min.apply(null,[11,2,3]); // 2
    var max2 = Math.max.apply(arr); // -Infinity
自己定義函數(shù)

略……

五、數(shù)組的迭代類操作

主要指 數(shù)組迭代既琴,過濾占婉,按條件查找 等操作

  • 除非特別說明,此類函數(shù)的\color{red}{ **參數(shù)** } 是一個(gè)\color{red}{回調(diào)函數(shù)} 甫恩,回調(diào)函數(shù)的參數(shù)

\color{red}{item(項(xiàng)目值), index(項(xiàng)目索引), array(數(shù)組本身)}

(一) forEach()

遍歷數(shù)組全部元素逆济,利用回調(diào)函數(shù)對(duì)數(shù)組進(jìn)行操作
自動(dòng)遍歷整個(gè)數(shù)組,且無法break中途跳出循環(huán)體
不支持 return 操作輸出 和 結(jié)束函數(shù)磺箕,return只用于結(jié)束本輪循環(huán)奖慌。

  • 返回值:無(函數(shù)無返回值時(shí),返回值為 undefined)
  • 是否改變?cè)瓟?shù)據(jù):否
    注意區(qū)別松靡,我們可以在回調(diào)函數(shù)內(nèi)部通過索引值修改數(shù)組元素简僧,但是forEach函數(shù)不會(huì)修改原數(shù)組。
  • 應(yīng)用:
    主要用于需要循環(huán)遍歷每一項(xiàng)數(shù)組元素的時(shí)候雕欺,或者岛马,需要對(duì)每一個(gè)元素進(jìn)行相同的操作的時(shí)候。
    var arr = [1,2,3,4,5];
    var res = arr.forEach(function (item,index,array) {
        console.log("sss", item);
        array[index] = item + 1; // 通過數(shù)組索引改變了原數(shù)組屠列;
        return 1; //這里加上這句之后啦逆,跳出當(dāng)前循環(huán),不會(huì)跳出函數(shù)
        array[index] = item * 10; // 不會(huì)執(zhí)行這句
    });
    console.log(res);//undefined;
    console.log(arr);//[2,3,4,5,6]
image.png
    var arr = [1,2,3,4,5];
    var res = arr.forEach(function (item,index,array) {
        item --;
        console.log("sss", item);
        // array[index] = item + 1; // 通過數(shù)組索引改變了原數(shù)組笛洛;
        // return 1; //這里加上這句之后夏志,跳出當(dāng)前循環(huán)
        // array[index] = item * 10; // 不會(huì)執(zhí)行這句
    });
    console.log(res);//undefined;
    console.log(arr);//[1,2,3,4,5]
可見forEach不會(huì)修改原數(shù)組,我們操作了item撞蜂,原數(shù)組的元素也不會(huì)變盲镶,除非通過索引賦值

(二)map()

按照原始數(shù)組元素順序依次操作元素
return 語句 結(jié)束本輪循環(huán)侥袜,并將 return語句后面的表達(dá)式結(jié)果,保存到一個(gè)新數(shù)組里邊

  • 返回值:新數(shù)組溉贿,與原數(shù)組等長(zhǎng)
  • 是否改變?cè)瓟?shù)據(jù):否
  • 應(yīng)用
    var arr = [1,2,3,4,5];
    var resArr = arr.map(function (item) {
        return  -- item; 
        console.log("sss", item); // 不會(huì)執(zhí)行這一步
    });
    console.log("resArr", resArr);//[0,1,2,3,4];
    console.log("arr", arr);//[1,2,3,4,5]
image.png

(三)filter()

filter()方法篩選符合條件的元素枫吧,以數(shù)組形式輸出。

  • 返回值:包含通過測(cè)試的數(shù)組元素的新數(shù)組
  • 是否改變?cè)瓟?shù)組:否
  • 應(yīng)用:搜索功能宇色,數(shù)組去重

(四)reduce()

(五)every()

檢測(cè)是否所有元素符合條件的九杂,return false結(jié)束函數(shù)。每一輪循環(huán)默認(rèn)return false

  • 返回值:
    false:默認(rèn)返回值
    true:
  • 是否改變了原數(shù)據(jù):否
  • 應(yīng)用:
    var arr = [1,2,3,4,5,6,7,8];
   
    var everyFlag = arr.every(function(item,index){
        console.log("index2",index);
    });
第一輪循環(huán)宣蠕,默認(rèn)return false例隆,從而終止了函數(shù)

(六)some()

檢測(cè) 是否所有元素中符合條件,return true 結(jié)束函數(shù)抢蚀。每一輪循環(huán)默認(rèn)return false

  • 返回值:
    true:
    false:默認(rèn)返回值
  • 是否改變了原數(shù)據(jù):否
  • 應(yīng)用:
var someFlag = arr.some(function(item,index){
        console.log("index1",index);
});
每一輪循環(huán)镀层,默認(rèn)return false,故沒有終止函數(shù)直到循環(huán)結(jié)束函數(shù)執(zhí)行完畢

(七)indexOf()皿曲,lastIndexOf()

(八)findIndex()唱逢,find()

find() 返回符合條件的第一個(gè)元素
兼容性差

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屋休,隨后出現(xiàn)的幾起案子坞古,更是在濱河造成了極大的恐慌,老刑警劉巖劫樟,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痪枫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叠艳,警方通過查閱死者的電腦和手機(jī)奶陈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虑绵,“玉大人尿瞭,你說我怎么就攤上這事〕峋Γ” “怎么了声搁?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)捕发。 經(jīng)常有香客問我疏旨,道長(zhǎng),這世上最難降的妖魔是什么扎酷? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任檐涝,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谁榜。我一直安慰自己幅聘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布窃植。 她就那樣靜靜地躺著帝蒿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巷怜。 梳的紋絲不亂的頭發(fā)上葛超,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音延塑,去河邊找鬼绣张。 笑死,一個(gè)胖子當(dāng)著我的面吹牛关带,可吹牛的內(nèi)容都是我干的侥涵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼宋雏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼独令!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起好芭,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冲呢,沒想到半個(gè)月后舍败,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敬拓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年邻薯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乘凸。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厕诡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出营勤,到底是詐尸還是另有隱情灵嫌,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布葛作,位于F島的核電站寿羞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赂蠢。R本人自食惡果不足惜绪穆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玖院,春花似錦菠红、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扔傅,卻和暖如春耍共,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猎塞。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工试读, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荠耽。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓钩骇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親铝量。 傳聞我的和親對(duì)象是個(gè)殘疾皇子倘屹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容