JS 數(shù)組方法整理

1. join()

功能:

將數(shù)組中的所有元素放入一個字符串望伦。元素是通過指定的分隔符進行分隔的疹启,默認使用’,'號分割葛账,不改變原數(shù)組
演示:

  let arr = [1,2,3];
  console.log(arr.join()); // 1,2,3
  console.log(arr); // [1,2,3]

2. concat()

功能:
用于連接兩個或多個數(shù)組。該方法不會改變現(xiàn)有的數(shù)組皮仁,僅會返回被連接數(shù)組的一個副本

  let arr1 = [1,2,3];
  let arr2 = [4,5];
  let arr3 = arr1.concat(arr2)
  console.log(arr1); // 1,2,3
  console.log(arr3); // [1,2,3,4,5]

3. push()

功能:
可向數(shù)組的末尾添加一個或多個元素籍琳,并返回新的長度。末尾添加贷祈,返回的是長度趋急,會改變原數(shù)組

  let arr1 = [1,2,3];
  let arr2 = arr1.push(4);
  console.log(arr1); // [1,2,3,4]
  console.log(arr2); // 4

  push 方法可以一次添加多個元素 push(item1,item2,item3...)

4. pop()

功能:
用于刪除并返回數(shù)組的最后一個元素。返回最后一個元素势誊,會改變原數(shù)組呜达。

  let arr = [1,2,3];
  console.log(arr.pop()); // 3
  console.log(arr); // [1,2]

5. shift()

功能:
用于把數(shù)組的第一個元素從其中刪除,并返回第一個元素的值粟耻。返回第一個元素查近,改變原數(shù)組。

  let arr = [1,2,3];
  console.log(arr.shift()); // 1
  console.log(arr); // [2,3]

6. unshift()

功能;
向數(shù)組的開頭添加一個或更多元素挤忙,并返回新的長度霜威。返回新長度,改變原數(shù)組册烈。

  let arr = [1,2,3];
  console.log(arr.unshift(3,5)); // 5
  console.log(arr); // [3,5,1,2,3]
  tip: 該方法可以不傳參數(shù)戈泼, 不傳參數(shù)就是不增加元素

7. slice()

功能;
返回一個新的數(shù)組,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素赏僧。返回選定的元素大猛,該方法不會修改原數(shù)組。

  let arr = [1,2,3,4];
  console.log(arr.slice(1,3)); // [2,3]
  console.log(arr); // [1,2,3,4]
  tip: 該方法可以不傳參數(shù)淀零, 不傳參數(shù)就是不增加元素

8. splice()

功能;
可刪除從 index 處開始的零個或多個元素挽绩,并且用參數(shù)列表中聲明的一個或多個值來替換那些被刪除的元素。如果從 arrayObject 中刪除了元素驾中,則返回的是含有被刪除的元素的數(shù)組唉堪。splice() 方法會直接對數(shù)組進行修改模聋。

  let arr = [1,2,3,4];
  console.log(arr.splice(1,0,6)); // []
  console.log(arr); // [1,6,2,3,4]

  let arr1=[1,2,3,4]
  console.log(arr1.splice(1,2,6)); // [2,3]
  console.log(arr1); // [1,6,4]

9. substr()和substring()

功能;
相同點:如果只是寫一個參數(shù),兩者的作用都一樣:都是是截取字符串從當(dāng)前下標(biāo)以后直到字符串最后的字符串片段巨坊。
substr(startIndex);
substring(startIndex);

    let str="123456789"
    console.log(str.substr(2)) // "3456789"
    console.log(str.substring(2)) // "3456789"

不同點:第二個參數(shù)
substr(startIndex,lenth): 第二個參數(shù)是截取字符串的長度(從起始點截取某個長度的字符串)撬槽;
substring(startIndex, endIndex): 第二個參數(shù)是截取字符串最終的下標(biāo) (截取2個位置之間的字符串,‘含頭不含尾’)此改。

    let str="123456789"
    console.log(str.substr(2,5)) // "34567"
    console.log(str.substring(2,5)) // "345"

10. sort 排序

功能:按照 Unicode code 位置排序趾撵,默認升序

  var arr1 =['cc','ee','aa','33']
  arr1.sort() // ["33", "aa", "cc", "ee"]

  let arr = [20,10,2,1,3];
  arr.sort();// [1, 10, 2, 20, 3]
  arr.sort(function(a,b){
    return a-b;    //升序
  }); //[1, 2, 3, 10, 20]
  arr.sort(function(a,b){
    return b-a;    //降序
  }); //[20,10,3,2,1]

11. reverse()

功能:
方法用于顛倒數(shù)組中元素的順序。返回的是顛倒后的數(shù)組共啃,會改變原數(shù)組占调。

  let arr = [1,2,3,4];
  console.log(arr.reverse()); // [4,3,2,1]
  console.log(arr); // [4,3,2,1]

12. indexOf() 和 lastIndexOf()

功能:
都接受兩個參數(shù):查找的值、查找起始位置不存在移剪,返回 -1 究珊;存在,返回位置纵苛。
indexOf 是從前往后查找;
lastIndexOf 是從后往前查找剿涮。

  let arr = [1,2,3,4,3,6,3];;
  arr.indexOf(3) // 2
  arr.lastIndexOf(3) // 6

  arr.indexOf(2) // 1
  arr.lastIndexOf(2) // 1

  arr.indexOf(7) // -1
  arr.lastIndexOf(7) // -1
 

13. every() 和 some()

功能:
every() 判斷數(shù)組中每一項都是否滿足條件,只有所有項都滿足條件攻人,才會返回true取试。
some() 判斷數(shù)組中是否存在滿足條件的項,只要有一項滿足條件怀吻,就會返回true瞬浓。

  let arr = [1, 2, 3, 4, 5, 6];
  arr.every(x=>x>0);//return true;
  arr.every(x=>x>5);//return false;
  arr.some(x=>x>5);//return true;

14. filter()

功能:
過濾功能,數(shù)組中的每一項運行給定函數(shù)蓬坡,返回滿足過濾條件組成的數(shù)組猿棉。 接受三個參數(shù)
element 數(shù)組中當(dāng)前正在處理的元素。
index可選 正在處理的元素在數(shù)組中的索引屑咳。
array可選 調(diào)用了 filter 的數(shù)組本身萨赁。

  let arr = [1,2,3,4,5,6,3,1];
  arr.filter(function(v,i,self){
    return self.indexOf(v) == i;
  });
  //[1, 2, 3, 4, 5, 6]

15. map()

功能:
調(diào)用的數(shù)組的每一個元素傳遞給指定的函數(shù),并返回一個新數(shù)組 ,不修改原數(shù)組。

  let arr = [2,3,4,5,6];
  let arr1= arr.map(function(x){
    return x*x;
  });
  console.log(arr1); // [4, 9, 16, 25, 36]
  console.log(arr); // [2, 3, 4, 5, 6]

16. forEach()

功能:
從頭至尾遍歷數(shù)組芒珠,為每個元素調(diào)用指定函數(shù)
輸入為一個待遍歷函數(shù)操软,函數(shù)的參數(shù)依次為:數(shù)組元素、元素的索引掂林、數(shù)組本身

  let arr = [2,3,4,5,6];
  let arr1=[];

  arr.forEach(function(item){
    arr1.push(item)
  });
  console.log(arr1); // [2,3,4,5,6]
  console.log(arr); // [2, 3, 4, 5, 6]

17. reduce() 和 reduceRight()

功能:
reduce() 兩個參數(shù):函數(shù)和遞歸的初始值。從數(shù)組的第一項開始坝橡,逐個遍歷到最后
reduceRight() 從數(shù)組的最后一項開始泻帮,向前遍歷到第一項

  //可以用reduce快速求數(shù)組之和
  let arr=[1,2,3,4];
  arr.reduce(function(a,b){
    return a+b;
  }); //10

ES6操作數(shù)組的方法

1. find() 和 findIndex()

功能:
find() 傳入一個回調(diào)函數(shù),找到數(shù)組中符合當(dāng)前搜索規(guī)則的第一個元素计寇,返回它锣杂,并且終止搜索脂倦。
findIndex() 傳入一個回調(diào)函數(shù),找到數(shù)組中符合當(dāng)前搜索規(guī)則的第一個元素元莫,返回它的下標(biāo)赖阻,終止搜索。

find方法的回調(diào)函數(shù)可以接受三個參數(shù)踱蠢,依次為當(dāng)前的值火欧、當(dāng)前的位置和原數(shù)組。

  let arr=[1,2,3,4];
  console.log(arr.find(v => v == 2)) // 2
  console.log(arr.findIndex(v => v == 2)) // 1

2. entries()茎截,keys() 和 values()

功能:
相同點: 它們都返回一個遍歷器對象
不同點: 可以用for...of循環(huán)進行遍歷苇侵,唯一的區(qū)別是
keys()是對鍵名的遍歷、
values()是對鍵值的遍歷企锌,
entries()是對鍵值對的遍歷榆浓。

  for (let index of ['a', 'b'].keys()) {
  console.log(index);
}
// 0
// 1

for (let elem of ['a', 'b'].values()) {
  console.log(elem);
}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}
// 0 "a"
// 1 "b"

3. Array.from()

功能;
Array.from方法用于將兩類對象轉(zhuǎn)為真正的數(shù)組:類似數(shù)組的對象(array-like object)和可遍歷(iterable)的對象(包括 ES6 新增的數(shù)據(jù)結(jié)構(gòu) Set 和 Map)

  let arr = new Set(['a','b'])
  Array.from(arr) // ['a','b']

3. includes()

功能:
Array.prototype.includes方法返回一個布爾值,表示某個數(shù)組是否包含給定的值撕攒,與字符串的includes方法類似陡鹃。

  [1, 2, 3].includes(2)     // true
  [1, 2, 3].includes(4)     // false
  [1, 2, NaN].includes(NaN) // true

該方法的第二個參數(shù)表示搜索的起始位置,默認為0抖坪。如果第二個參數(shù)為負數(shù)萍鲸,則表示倒數(shù)的位置,如果這時它大于數(shù)組長度(比如第二個參數(shù)為-4柳击,但數(shù)組長度為3)猿推,則會重置為從0開始。

  [1, 2, 3].includes(3, 3);  // false
  [1, 2, 3].includes(3, -1); // true

4. flat() 和 flatMap()

功能:
數(shù)組的成員有時還是數(shù)組捌肴,Array.prototype.flat()用于將嵌套的數(shù)組“拉平”蹬叭,變成一維的數(shù)組。該方法返回一個新數(shù)組状知,對原數(shù)據(jù)沒有影響秽五。

  [1, 2, [3, 4]].flat()
  // [1, 2, 3, 4]

flat()默認只會“拉平”一層,如果想要“拉平”多層的嵌套數(shù)組饥悴,可以將flat()方法的參數(shù)寫成一個整數(shù)坦喘,表示想要拉平的層數(shù),默認為1西设。
如果不管有多少層嵌套瓣铣,都要轉(zhuǎn)成一維數(shù)組,可以用Infinity關(guān)鍵字作為參數(shù)贷揽。

  [1, 2, [3, [4, 5]]].flat()
  // [1, 2, 3, [4, 5]]

  [1, 2, [3, [4, 5]]].flat(2)
  // [1, 2, 3, 4, 5]

  [1, [2, [3]]].flat(Infinity)
  // [1, 2, 3]

flatMap()方法對原數(shù)組的每個成員執(zhí)行一個函數(shù)(相當(dāng)于執(zhí)行Array.prototype.map())棠笑,然后對返回值組成的數(shù)組執(zhí)行flat()方法。該方法返回一個新數(shù)組禽绪,不改變原數(shù)組蓖救。
flatMap()只能展開一層數(shù)組洪规。

  // 相當(dāng)于 [[2, 4], [3, 6], [4, 8]].flat()
  [2, 3, 4].flatMap((x) => [x, x * 2])
  // [2, 4, 3, 6, 4, 8]

  // 相當(dāng)于 [[[2]], [[4]], [[6]], [[8]]].flat()
  [1, 2, 3, 4].flatMap(x => [[x * 2]])
  // [[2], [4], [6], [8]]

數(shù)組的空位

注意,空位不是undefined循捺,一個位置的值等于undefined斩例,依然是有值的〈娱伲空位是沒有任何值念赶,in運算符可以說明這一點。

  0 in [undefined, undefined, undefined] // true
  0 in [, , ,] // false

上面代碼說明洋满,第一個數(shù)組的 0 號位置是有值的晶乔,第二個數(shù)組的 0 號位置沒有值珍坊。

ES5 對空位的處理牺勾,已經(jīng)很不一致了,大多數(shù)情況下會忽略空位阵漏。

forEach(), filter(), reduce(), every() 和some()都會跳過空位驻民。
map()會跳過空位,但會保留這個值
join()和toString()會將空位視為undefined履怯,而undefined和null會被處理成空字符串回还。

  // forEach方法
  [,'a'].forEach((x,i) => console.log(i)); // 1

  // filter方法
  ['a',,'b'].filter(x => true) // ['a','b']

  // every方法
  [,'a'].every(x => x==='a') // true

  // reduce方法
  [1,,2].reduce((x,y) => x+y) // 3

  // some方法
  [,'a'].some(x => x !== 'a') // false

  // map方法
  [,'a'].map(x => 1) // [,1]

  // join方法
  [,'a',undefined,null].join('#') // "#a##"

  // toString方法
  [,'a',undefined,null].toString() // ",a,,"
  ES6 則是明確將空位轉(zhuǎn)為undefined。

Array.from方法會將數(shù)組的空位叹洲,轉(zhuǎn)為undefined柠硕,也就是說,這個方法不會忽略空位运提。

  Array.from(['a',,'b'])
  // [ "a", undefined, "b" ]

擴展運算符(...)也會將空位轉(zhuǎn)為undefined蝗柔。

  [...['a',,'b']]
  // [ "a", undefined, "b" ]

copyWithin()會連空位一起拷貝。

  [,'a','b',,].copyWithin(2,0) // [,"a",,"a"]

fill()會將空位視為正常的數(shù)組位置民泵。

  new Array(3).fill('a') // ["a","a","a"]

for...of循環(huán)也會遍歷空位癣丧。

  let arr = [, ,];
  for (let i of arr) {
    console.log(1);
  }
  // 1
  // 1

上面代碼中,數(shù)組arr有兩個空位栈妆,for...of并沒有忽略它們胁编。如果改成map方法遍歷,空位是會跳過的鳞尔。

entries()嬉橙、keys()、values()寥假、find()和findIndex()會將空位處理成undefined市框。

  // entries()
  [...[,'a'].entries()] // [[0,undefined], [1,"a"]]

  // keys()
  [...[,'a'].keys()] // [0,1]

  // values()
  [...[,'a'].values()] // [undefined,"a"]

  // find()
  [,'a'].find(x => true) // undefined

  // findIndex()
  [,'a'].findIndex(x => true) // 0

由于空位的處理規(guī)則非常不統(tǒng)一,所以建議避免出現(xiàn)空位昧旨。

參考資料

阮一峰ECMAScript 6入門

MDN Array

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拾给,一起剝皮案震驚了整個濱河市祥得,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒋得,老刑警劉巖级及,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異额衙,居然都是意外死亡饮焦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門窍侧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來县踢,“玉大人,你說我怎么就攤上這事伟件∨鹌。” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵斧账,是天一觀的道長谴返。 經(jīng)常有香客問我,道長咧织,這世上最難降的妖魔是什么嗓袱? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮习绢,結(jié)果婚禮上渠抹,老公的妹妹穿的比我還像新娘。我一直安慰自己闪萄,他們只是感情好梧却,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桃煎,像睡著了一般篮幢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上为迈,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天三椿,我揣著相機與錄音,去河邊找鬼葫辐。 笑死搜锰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耿战。 我是一名探鬼主播蛋叼,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狈涮?” 一聲冷哼從身側(cè)響起狐胎,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歌馍,沒想到半個月后握巢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡松却,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年暴浦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晓锻。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡歌焦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砚哆,到底是詐尸還是另有隱情独撇,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布窟社,位于F島的核電站券勺,受9級特大地震影響绪钥,放射性物質(zhì)發(fā)生泄漏灿里。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一程腹、第九天 我趴在偏房一處隱蔽的房頂上張望匣吊。 院中可真熱鬧,春花似錦寸潦、人聲如沸色鸳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽命雀。三九已至,卻和暖如春斩箫,著一層夾襖步出監(jiān)牢的瞬間吏砂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工乘客, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狐血,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓易核,卻偏偏與公主長得像匈织,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354