主頁 > 前端設計 > 「陣列方法」寫給女友的一系列 JS 陣列操作(建議收藏 | 內附思維導圖)

「陣列方法」寫給女友的一系列 JS 陣列操作(建議收藏 | 內附思維導圖)

2020-12-04 12:21:45 前端設計

前言

最近和女友,咳咳…(說出來可能會被打s)學習JS陣列方法,用幾個字形容的話就是聽說過,實際使用、遇到的時候就分不清具體方法會得到怎樣的結果,

今天我將通過這篇文章好好整理一下關于JS陣列的方法,讓大家通過這一篇文章 掌握 陣列一系列操作,同時,在面試或者作業的時候也能寫出簡潔、優雅、美觀、高效的代碼,其次,這篇寫給女友,她看到會感動到哭嘛?會嗎會嗎會嗎?

話說我有女友嗎?

啊這,這…這重要嗎?

(手機端可能看不清)獲取高清PDF,請在微信公眾號【小獅子前端Vue】回復【陣列方法】

文章目錄

    • 前言
    • 閱讀須知
    • 陣列的遍歷
      • for 回圈
      • for..of 回圈
      • for...in 回圈
      • array.forEach() 方法
      • map 遍歷
      • reduce 遍歷
        • 答案: D
      • filter()
      • every()
      • some()
      • find 和 findIndex
      • keys 與 values 與 entries
    • 改變原始陣列方法
      • sort()
      • push()
      • pop()
      • shift()
      • unshift()
      • reverse()
      • splice()
    • 陣列的映射
      • Array.map()方法
      • Array.from()方法
    • 陣列的連接
      • Array.concat() 方法
      • 展開運算子
    • 獲取陣列的片段
      • Array.slice() 方法
    • 轉換陣列
      • join()
      • split()
      • toString()
    • 陣列的扁平化
      • flat()
    • 備忘錄
    • 本文參考
    • 最后

閱讀須知

開門見山,我先介紹一下本文整體目錄結構,介紹我將輸出的大概內容,

顯然,陣列的方法有很多很多,但是實際作業或者面試程序中有些用到的少之又少,因此,我不會將所有的方法都提出來,然后決議,那么,我會將重要程度比較高的方法盡量用詳細簡潔的語言帶過,同時例舉幾個樣例,自測案例為你加深鞏固,

其次,本文還會提及面試常考問題,比如經典扁平化問題,陣列去重合并、排序、改變原陣列的方法不改變原陣列的方法等等,

好了,讓我們進入正文~

陣列的遍歷

猶記得今年快手面試官就問了一道經典面試題:說說你所知道的陣列的遍歷方法?

我想這個問題小伙伴們面試時應該也會遇到過吧,面試官問這個問題其一就是考察你對陣列方法掌握程度,其二可以通過你說的方法選擇其中一個繼續深度詢問,比如 reducemap使用等等,因此,我將 陣列遍歷 作為第一個模塊來講解,

for 回圈

let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
  console.log(arr[i]);
}
// 1
// 2
// 3
// 4
// 5

for…of 回圈

摘自MDN上一句話,for...of 陳述句遍歷可迭代物件定義要迭代的資料,簡單來說,for...of遍歷的就是 value

let arr = ['Chocolate', 'zhlll', 'lionkk'];

for (let val of arr) {
  console.log(val);
}
// Chocolate
// zhlll
// lionkk

for…in 回圈

摘自MDN上一句話,for...in 陳述句以任意順序迭代物件的可列舉屬性,簡單來說,for...in遍歷的就是 key,對于陣列,key對應著的是陣列的下標索引

let arr = ['Chocolate', 'zhlll', 'lionkk'];

for (let key in arr) {
  console.log(key);
}
// 0
// 1
// 2

array.forEach() 方法

先來介紹語法:

array.forEach(callback(currentValue, index, arr), thisArg)

callback:為陣列中每個元素執行的函式,該函式接收一至三個引數
currentValue 陣列中正在處理的當前元素
index (可選) 陣列中正在處理的當前元素的索引
arr (可選) forEach() 方法正在操作的陣列
thisArg 可選引數,當執行回呼函式callback,用作this值

簡單例子:

let arr = ['Chocolate', 'zhlll', 'lionkk'];

arr.forEach(function (cur, index, arr) {
  console.log(cur, index, arr);
})

// Chocolate 0 [ 'Chocolate', 'zhlll', 'lionkk' ]
// zhlll 1 [ 'Chocolate', 'zhlll', 'lionkk' ]
// lionkk 2 [ 'Chocolate', 'zhlll', 'lionkk' ]

從上述例子中,了解到 forEach需要傳遞一個回呼函式,而那三個引數,后面兩個是可選的,那么如何讓代碼更加優雅美觀一點呢,同時,后面兩個引數按需添加即可:

let arr = ['Chocolate', 'zhlll', 'lionkk'];

arr.forEach((cur) => {
  console.log(cur);
})
// Chocolate
// zhlll
// lionkk

疑難點,我想小伙伴們,應該對最后一個 thisArg 有疑問吧,現在就來解釋一下:

function Foo() {
  this.sum = 0;
  this.cnt = 0;
}
// 在原型上添加一個名為 doSth 方法
Foo.prototype.doSth = function (arr) {
  arr.forEach(function (cur) {
    this.sum += cur;
    this.cnt++;
  }, this) // this 指向實體物件
}

let foo = new Foo();
let arr = [1, 2, 3];
foo.doSth(arr);

console.log(foo.sum, foo.cnt);
// 6 3
// 解釋: 6 === (1+2+3)  3 === (1+1+1)

注意:如果使用箭頭函式運算式來傳入函式引數, thisArg 引數會被忽略,因為箭頭函式在詞法上系結了 this 值,

因此,如果對于普通函式的話,可以看做是將 this 通過傳參的形式解決無法繼承 問題,當然,通過箭頭函式的方式是一個不錯的選擇!

map 遍歷

定義:回傳一個新陣列,其結果是該陣列中的每個元素是呼叫一次提供的回呼函式后的回傳值,

先來介紹語法:

let newArray = array.map(function(currentValue, index, arr), thisArg)

callback:為陣列中每個元素執行的函式,該函式接收一至三個引數
currentValue 陣列中正在處理的當前元素
index (可選) 陣列中正在處理的當前元素的索引
arr (可選) map() 方法正在操作的陣列
thisArg 可選引數,當執行回呼函式callback,用作this值

簡單例子:

let arr = ['Chocolate', 'zhlll', 'lionkk'];

let newArr = arr.map(function (cur, index, arr) {
  console.log(cur, index, arr);
  return cur + index;
})
// Chocolate 0 [ 'Chocolate', 'zhlll', 'lionkk' ]
// zhlll 1 [ 'Chocolate', 'zhlll', 'lionkk' ]
// lionkk 2 [ 'Chocolate', 'zhlll', 'lionkk' ]

console.log(newArr)
// [ 'Chocolate0', 'zhlll1', 'lionkk2' ]

疑難點,我想小伙伴們,有了前置問題了,這次理解 thisArg 應該沒有太多問題了吧,看看下面例子:

function Foo() {
  this.sum = 0;
  this.cnt = 0;
}
// 在原型上添加一個名為 doSth 方法
Foo.prototype.doSth = function (arr) {
  let newArr = arr.map(function (cur) {
    this.sum += cur;
    this.cnt++;
    return cur + 10;
  }, this) // this 指向實體物件
  return newArr;
}

let foo = new Foo();
let arr = [1, 2, 3];

console.log(foo.doSth(arr)); // [ 11, 12, 13 ]
console.log(foo.sum);// 6
console.log(foo.cnt);// 3

一些小操作~

let arr = [1, 4, 9, 16];
let res = arr.map(Math.sqrt); // 傳入Math中sqrt得到陣列中每個元素的平方根
console.log(res); // [ 1, 2, 3, 4 ]

總結

  • map 不修改呼叫它的原陣列本身(當然可以在 callback 執行時改變原陣列)
    回呼函式不回傳值時,最后新陣列的每個值都為undefined
  • this 的值最終相對于 callback 函式的可觀察性是依據this規則,也就是 this 指向問題
  • map 會回傳一個新陣列

reduce 遍歷

定義:對陣列中的每個元素執行一個由您提供的 reducer 函式(升序執行),將其結果匯總為單個回傳值,

先來介紹語法:

let res= array.reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)

callback:為陣列中每個元素執行的函式,該函式接收一至4個引數
accumulator 累計器
currentValue 當前值
currentIndex 當前索引
array 陣列
initialValue 作為第一次呼叫 callback函式時的第一個引數的值, 如果沒有提供初始值,則將使用陣列中的第一個元素, 在沒有初始值的空陣列上呼叫 reduce 將報錯,

簡單例子:

let arr = [3, 5, 7, 1, 2];
let res = arr.reduce(function (acc, cur, index, arr) {
  console.log(acc, cur, index, arr);
  return acc + cur;
}, 0)
// 0 3 0 [ 3, 5, 7, 1, 2 ]
// 3 5 1 [ 3, 5, 7, 1, 2 ]
// 8 7 2 [ 3, 5, 7, 1, 2 ]
// 15 1 3 [ 3, 5, 7, 1, 2 ]
// 16 2 4 [ 3, 5, 7, 1, 2 ]
console.log(res);
// 18

看完上面代碼,你可能還是蒙的,怎么一下輸出這么多,結合下面 gif 動圖再來理解一下吧:

疑難點,我想小伙伴們對于引數那么多應該一下給看懵了,下面用一些小操作展示一下,并且提供一點自測題目加深鞏固~

let arr = [1, 2, 3, 4, 5];
let res = arr.reduce((acc, cur) => {
  return acc + cur;
}, 0)
console.log(res);// 15

自測題:看看下面輸出什么?

[1, 2, 3, 4].reduce((x, y) => console.log(x, y));
  • A: 1 2 and 3 3 and 6 4
  • B: 1 2 and 2 3 and 3 4
  • C: 1 undefined and 2 undefined and 3 undefined and 4 undefined
  • D: 1 2 and undefined 3 and undefined 4
答案

答案: D

reducer 函式接收4個引數:

  1. Accumulator (acc) (累計器)
  2. Current Value (cur) (當前值)
  3. Current Index (idx) (當前索引)
  4. Source Array (src) (源陣列)

reducer 函式的回傳值將會分配給累計器,該回傳值在陣列的每個迭代中被記住,并最后成為最終的單個結果值,

reducer 函式還有一個可選引數initialValue, 該引數將作為第一次呼叫回呼函式時的第一個引數的值,如果沒有提供initialValue,則將使用陣列中的第一個元素,

在上述例子,reduce方法接收的第一個引數(Accumulator)是x, 第二個引數(Current Value)是y

在第一次呼叫時,累加器x1,當前值“y”2,列印出累加器和當前值:12

例子中我們的回呼函式沒有回傳任何值,只是列印累加器的值和當前值,如果函式沒有回傳值,則默認回傳undefined, 在下一次呼叫時,累加器為undefined,當前值為“3”, 因此undefined3被列印出,

在第四次呼叫時,回呼函式依然沒有回傳值, 累加器再次為 undefined ,當前值為“4”, undefined4被列印出,


總結

  • 如果陣列為空且沒有提供 initialValue,會拋出TypeError
  • 如果沒有提供 initialValuereduce 會從索引1的地方開始執行 callback 方法,跳過第一個索引,如果提供 initialValue ,從索引0開始,
  • acc為傳入函式的回傳值,如果是 console.log,則回傳默認值 undefined

filter()

定義:創建一個新陣列, 其包含通過所提供函式實作的測驗的所有元素,

先來介紹語法:

let newArray = array.filter(function(currentValue, index, arr), thisArg)

callback:為陣列中每個元素執行的函式,該函式接收一至三個引數
currentValue 陣列中正在處理的當前元素
index (可選) 陣列中正在處理的當前元素的索引
arr (可選) filter() 方法正在操作的陣列
thisArg(可選引數),當執行回呼函式callback,用作this值

簡單例子:

let arr = [1, 2, 3, 4, 5];

let newArr = arr.filter(function (cur, index) {
  console.log(cur, index);
  return cur % 2 == 0;
})
// 1 0
// 2 1
// 3 2
// 4 3
// 5 4
console.log(newArr); // [ 2, 4 ]

關于 thisArg 相關可以參考上文 array.forEach() 方法 部分,

簡單來說,就是回傳滿足條件的結果,

every()

定義:測驗一個陣列內的所有元素是否都能通過某個指定函式的測驗,它回傳的是一個 Boolean 型別的值,

先來介紹語法:

array.every(function(currentValue, index, arr), thisArg)

callback:為陣列中每個元素執行的函式,該函式接收一至三個引數
currentValue 陣列中正在處理的當前元素
index (可選) 陣列中正在處理的當前元素的索引
arr (可選) every() 方法正在操作的陣列
thisArg 可選引數,當執行回呼函式callback,用作this值

let res1 = [1, 2, 3, 4, 5].every(function (cur) {
  return cur > 10;
})
console.log(res1); // false

let res2 = [1, 2, 3, 4, 5].every(function (cur) {
  return cur >= 1;
})
console.log(res2); // true

關于 thisArg 相關可以參考上文 array.forEach() 方法 部分,

簡單來說,就是回傳是否都能滿足特定條件的結果,用布林值回傳,

some()

定義:測驗陣列中是不是至少有1個元素通過了被提供的函式測驗,它回傳的是一個 Boolean 型別的值

先來介紹語法:

array.some(function(currentValue, index, arr), thisArg)

callback:為陣列中每個元素執行的函式,該函式接收一至三個引數
currentValue 陣列中正在處理的當前元素
index (可選) 陣列中正在處理的當前元素的索引
arr (可選) some() 方法正在操作的陣列
thisArg (可選引數),當執行回呼函式callback,用作this值

let res1 = [1, 2, 3, 4, 5].some(function (cur) {
  return cur > 10;
})
console.log(res1); // false

let res2 = [1, 2, 3, 4, 5].some(function (cur) {
  return cur === 1;
})
console.log(res2); // true

關于 thisArg 相關可以參考上文 array.forEach() 方法 部分,

簡單來說,就是回傳是否至少有1個滿足特定條件的結果,用布林值回傳,

find 和 findIndex

該方法在ECMAScript 6規范中被加入,可能不存在于某些實作中,

定義:

find: 回傳陣列中滿足提供的測驗函式的第一個元素的值,否則回傳 undefined

findIndex:陣列中通過提供測驗函式的第一個元素的索引,否則,回傳 -1

先來介紹語法:

let ele = array.find(function(elemnet, index, arr), thisArg)

let eleIndex = array.findIndex(function(elemnet, index, arr), thisArg)

callback:為陣列中每個元素執行的函式,該函式接收一至三個引數
elemnet 陣列中正在處理的當前元素
index (可選) 陣列中正在處理的當前元素的索引
arr (可選) find方法正在操作的陣列
thisArg 可選引數,當執行回呼函式callback,用作this值

let res1 = [1, 2, 3, 4, 5].find(function (cur) {
  return cur > 2;
})
console.log(res1); // 3

let res2 = [1, 2, 3, 4, 5].findIndex(function (cur) {
  return cur > 2;
})
console.log(res2); // 2

keys 與 values 與 entries

定義:

  • keys() 方法回傳一個包含陣列中每個索引鍵的 Array Iterator 物件,
  • values() 方法回傳一個新的 Array Iterator 物件,該物件包含陣列每個索引的值
  • entries() 方法回傳一個新的 Array Iterator 物件,該物件包含陣列中每個索引的鍵/值對
arr.keys()
arr.values()
arr.entries()

簡單例子:

let arr = ['Chocolate', 'zhlll', 'lionkk'];

let itKeys = arr.keys();
let itVals = arr.values();
let itEntries = arr.entries();

for (let it of itKeys) {
  console.log(it);
}
// 0
// 1
// 2
for (let it of itVals) {
  console.log(it);
}
// Chocolate
// zhlll
// lionkk
for (let it of itEntries) {
  console.log(it);
}
// [ 0, 'Chocolate' ]
// [ 1, 'zhlll' ]
// [ 2, 'lionkk' ]

好了,到此關于陣列的遍歷方式基本上介紹完畢了,也許還有其它方法,但是萬變不離其宗,接下來我們將探究 改變原陣列 的方法,

改變原始陣列方法

看過我之前關于 Vue 資料劫持原始碼分析那篇博客文章小伙伴應該知道,里面就有提到了用裝飾者模式解決無法處理陣列問題,其中就有提到對于改變原始陣列的方法,這些需要繼續遞回觀察,那么,接下來,我們就來分別探討一下它們的使用:

sort()

至于為什么我會排第一個,對,面試遇到過,當時我說對某手面試官說默認按照從小到大進行排序,通過學習后,我發現不是的…

先來介紹語法:

arr.sort([compareFunction])

compareFunction 可選,用來指定按某種順序進行排列的函式,
如果省略,元素按照轉換為的字串的各個字符的Unicode位點進行排序,
否則,如果指明了compareFunction:
如果 compareFunction(a, b) 小于 0 ,那么 a 會被排列到 b 之前;
如果 compareFunction(a, b) 等于 0 , a 和 b 的相對位置不變,
如果 compareFunction(a, b) 大于 0 , b 會被排列到 a 之前,

簡單例子:

let arr = [1, 10, 2, 5, 8, 3];

arr.sort(); // 默認
console.log(arr); // [ 1, 10, 2, 3, 5, 8 ]

arr.sort((a, b) => a - b); // 從小到大排序
console.log(arr); // [ 1, 2, 3, 5, 8, 10 ]

arr.sort((a, b) => b - a); // 從大到小排序
console.log(arr); // [ 10, 8, 5, 3, 2, 1 ]

push()

類似堆疊、佇列的一些操作

注意push() 成功之后會回傳陣列的長度,

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

pop()

類似堆疊、佇列的一些操作

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

shift()

類似堆疊、佇列的一些操作

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

unshift()

定義:將一個或多個元素添加到 陣列的開頭,并 (該方法修改原有陣列)

注意:該方法會回傳該陣列的新長度

let arr = [1, 2, 100];
let res = arr.unshift(4, 5, 6);
console.log(arr); // [ 4, 5, 6, 1, 2, 100 ]
console.log(res); // 6

reverse()

定義:將陣列中元素的位置顛倒,并回傳該陣列,

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

splice()

這個我放最后一個也是有原因的,它比其它幾個要更復雜一點,剛開始我也是花了老長時間才理解,而且原本一直與 split() 這些分不清楚,

定義:

通過洗掉或替換現有元素或者原地添加新的元素來修改陣列,并以陣列形式回傳被修改的內容,

array.splice(start,deleteCount,item1,.....,itemX)z

start: 指定修改的開始位置(從0計數)
1. 如果超出了陣列的長度,則從陣列末尾開始添加內容
2. 如果是負值,則表示從陣列末位開始的第幾位(從-1計數,這意味著-n是倒數第n個元素,并且等價于array.length-n)
3. 如果負數的絕對值大于陣列的長度,則表示開始位置為第0位

deleteCount(可選) : 整數,表示要移除的陣列元素個數
1. 如果 deleteCount 大于 start 之后的元素的總數,則從 start 后面的元素都將被 洗掉(含第 start 位)
2. 如果 deleteCount 被省略了,或者它的值大于等于array.length - start(也就是 說,如果它大于或者等于start之后的所有元素的數量),那么start之后陣列的所有元素都會被洗掉,
3. 如果 deleteCount 是 0 或者負數,則不移除元素,這種情況下,至少應添加一個新 元素,

item1, item2, …(可選)
要添加進陣列的元素,從start 位置開始,如果不指定,則 splice() 將只洗掉陣列元素,

從第2位開始插入“Chocolate”

let arr = ['one', 'two', 'three'];

arr.splice(2, 0, 'Chocolate');
console.log(arr);// [ 'one', 'two', 'Chocolate', 'three' ]

從第 2 位開始洗掉 1 個元素,然后插入“Chocolate”

let arr = ['one', 'two', 'three'];

arr.splice(2, 1, 'Chocolate');
console.log(arr);// [ 'one', 'two', 'Chocolate' ]

主流的還是這7個方法,對于改變原陣列還有 fill()copyWithin() 方法,小伙伴們可以繼續研究~


陣列的映射

Array.map()方法

上文已經介紹

Array.from()方法

定義:通過在每個陣列項上使用 callback 呼叫結果來創建一個新陣列,

先來介紹語法:

 Array.from(Array,callback(currentValue, index, arr))

簡單例子:

let arr = [1, 2, 3];

let newArr = Array.from(arr, function (cur) {
  return cur + 10;
})
console.log(newArr);// [ 11, 12, 13 ]

陣列的連接

Array.concat() 方法

array.concat(array1[, array2, ...]) 將一個或多個陣列連接到原始陣列,如下所示,連接兩個陣列:

let arrA = [1, 2, 3];
let arrB = [4, 5, 6];
let ans = arrA.concat(arrB);
console.log(ans);// [ 1, 2, 3, 4, 5, 6 ]

展開運算子

let arrA = [1, 2, 3];
let arrB = [4, 5, 6];
let ans = [...arrA, ...arrB];
console.log(ans);// [ 1, 2, 3, 4, 5, 6 ]

獲取陣列的片段

Array.slice() 方法

定義:
回傳一個新的陣列物件,這一物件是一個由 beginend 決定的原陣列的淺拷貝(包括 begin,不包括 end)——原始陣列不會被改變,

先介紹語法:

arr.slice([begin[, end]])

begin (可選)

  1. 提取起始處的索引(從 0 開始),從該索引開始提取原陣列元素,
  2. 如果該引數為負數,則表示從原陣列中的倒數第幾個元素開始提取
  3. slice(-2) 表示提取原陣列中的倒數第二個元素到最后一個元素(包含最后一個元素)
  4. 如果省略 begin,則 slice 從索引 0 開始,
  5. 如果 begin 大于原陣列的長度,則會回傳空陣列,

end (可選)

  1. slice(1,4) 會提取原陣列中從第二個元素開始一直到第四個元素的所有元素 (索引為 1, 2, 3的元素)
  2. 如果該引數為負數, 則它表示在原陣列中的倒數第幾個元素結束抽取,
  3. 如果 end 被省略,則 slice 會一直提取到原陣列末尾,
  4. 如果 end 大于陣列的長度,slice 也會一直提取到原陣列末尾,
let fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
let res = fruits.slice(1, 3);
let res1 = fruits.slice(1);
let res2 = fruits.slice(-1);
let res3 = fruits.slice(0, -1);
console.log(res); // [ 'Orange', 'Lemon' ]
console.log(res1);// [ 'Orange', 'Lemon', 'Apple', 'Mango' ]
console.log(res2);// [ 'Mango' ]
console.log(res3);// [ 'Banana', 'Orange', 'Lemon', 'Apple' ]

轉換陣列

join()

定義:

將一個陣列(或一個類陣列物件)的所有元素連接成一個字串并回傳這個字串,如果陣列只有一個專案,那么將回傳該專案而不使用分隔符,

語法:

arr.join(separator)

簡單例子:

let arr = ['one', 'two', 'three'];
let res = arr.join('^');
let res1 = arr.join('&');

console.log(res); // one^two^three
console.log(res1); // one&two&three

split()

定義:

使用指定的分隔符字串將一個 String 物件分割成子字串陣列,以一個指定的分割字串來決定每個拆分的位置,

語法:

str.split([separator[, limit]])
const str = 'The best Chocolate';

const words = str.split(' ');
console.log(words); // [ 'The', 'best', 'Chocolate' ]
console.log(words[2]); // Chocolate

toString()

定義:

回傳一個字串,表示指定的陣列及其元素,

當一個陣列被作為文本值或者進行字串連接操作時,將會自動呼叫toString 方法,

語法:

arr.toString()
let arr = ['one', 'two', 'three'];
console.log(arr.toString()); // one,two,three

陣列的扁平化

flat()

定義:

按照一個可指定的深度遞回遍歷陣列,并將所有元素與遍歷到的子陣列中的元素合并為一個新陣列回傳,

語法:

var newArray = arr.flat([depth])

引數
depth 可選
指定要提取嵌套陣列的結構深度,默認值為 1,
回傳值
一個包含將陣列與子陣列中所有元素的新陣列,

const arr1 = [0, 1, 2, [3, 4]];
console.log(arr1.flat()); // [ 0, 1, 2, 3, 4 ]

const arr2 = [0, 1, 2, [[[3, 4]]]];
console.log(arr2.flat(2)); // [ 0, 1, 2, [ 3, 4 ] ]

備忘錄

女朋友表示說:感動了!

本文參考

感謝大佬~

  • 「陣列方法」從詳細操作js陣列到淺析v8中array.js
  • MDN_Array
  • 通過事例重溫一下 JS 中 常見的15 種陣列操作(備忘清單)
  • JS陣列奇巧淫技
  • JS之陣列的幾個不low操作

最后

文章產出不易,還望各位小伙伴們支持一波!

往期精選:

小獅子前端の筆記倉庫

leetcode-javascript:LeetCode 力扣的 JavaScript 解題倉庫,前端刷題路線(思維導圖)

小伙伴們可以在Issues中提交自己的解題代碼,🤝 歡迎Contributing,可打卡刷題,Give a ?? if this project helped you!

訪問超逸の博客,方便小伙伴閱讀玩耍~

學如逆水行舟,不進則退
一百個Chocolate CSDN認證博客專家 CSDN博客專家 博客之星 前端開發攻城獅
JS,TS,LeetCode,Vue,React,演算法愛好者,
主要分享前端知識,立志成為優秀前端博主,
座右銘:學如逆水行舟,不進則退!
公眾號:小獅子前端Vue 期待小獅子們的加入~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/229881.html

標籤:其他

上一篇:瀏覽器實作滾動截屏

下一篇:C語言結構體占用記憶體總結

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more