摘要:示例使用作為深度,展開任意深度的嵌套數組會移除數組中的空項首先使用映射函數映射每個元素,然后將結果壓縮成一個新數組。注意對象數組不能使用方法來檢測。也就是返回值返回一個新的對象,該對象包含數組中每個索引的鍵值對。
前言
寫久了業務代碼的我,已經要被社會拋棄了。今天回過頭去鞏固基礎知識,發現有很多自己業務中不經常用,或者說是不知道那個方法,導致自己重寫一個方法去實現。關于Array對象的方法你是否只用concat、join、pop、push、shift、unshift、reverse、sort、slice、splice、toString、indexOf、find等?接下來我們就一起回顧一下那些我們用的少或者沒有用過的Array對象方法!
1. Array.from()從一個類似數組或可迭代對象中創建一個新的數組實例1.1 語法
/** * @description - 從一個類似數組或可迭代對象中創建一個新的數組實例(偽數組對象:擁有一個 length 屬性和若干索引屬性的任意對象;可迭代對象:可以獲取對象中的元素,如 Map和 Set 等) * @param arrayLike - 想要轉換成數組的偽數組對象或可迭代對象. * @param mapFn - 可選參數,如果指定了該參數,新數組中的每個元素會執行該回調函數. * @param thisArg - 可選參數,執行回調函數 mapFn 時 this 對象. * @return { Array } - 一個新的數組實例 */ Array.from(arrayLike[, mapFn[, thisArg]])1.2 示例
// Array from a String Array.from("foo"); // ["f", "o", "o"] // Array from a Set let s = new Set(["foo", window]); Array.from(s) // ["foo", window] // Array from a Map let m = new Map([[1, 2], [2, 4], [4, 8]]); Array.from(m); // [[1, 2], [2, 4], [4, 8]] // Array from an Array-like object (arguments) function f() { return Array.from(arguments); } f(1, 2, 3); // [1, 2, 3] // 在Array.from中使用箭頭函數 Array.from([1, 2, 3], x => x + x); // [2, 4, 6] // 偽數組 Array.from({length: 5}); // [undefined, undefined, undefined, undefined, undefined] Array.from({length: 5}, (v, i) => i); // [0, 1, 2, 3, 4] // 改變回調函數 mapFn 時 this 對象 Array.from([1, 2, 3], function(){console.log(this)}); // 瀏覽器環境下是三次 Window對象 var obj ={name: "obj"} Array.from([1, 2, 3], function(){console.log(this)}, obj); // 三次 obj 對象2. Array.prototype.copyWithin()
淺復制數組的一部分到同一數組中的另一個位置,并返回它,不會改變原數組的長度。2.1 語法
/** * @description - 淺復制數組的一部分到同一數組中的另一個位置,并返回它,不會改變原數組的長度。 * @param target - 0 為基底的索引,復制序列到該位置。如果 target 在 start 之后,復制的序列將被修改以符合 arr.length. * @param start - 0 為基底的索引,開始復制元素的起始位置。如果是負數,start 將從末尾開始計算。如果 start 被忽略,copyWithin 將會從0開始復制. * @param end - 0 為基底的索引,開始復制元素的結束位置。copyWithin 將會拷貝到該位置,但不包括 end 這個位置的元素。如果是負數, end 將從末尾開始計算. * @return { array } - 改變后的數組 */ arr.copyWithin(target[, start[, end]])2.2 示例
let numbers = [1, 2, 3, 4, 5]; numbers.copyWithin(-2); // [1, 2, 3, 1, 2] numbers.copyWithin(0, 3); // [4, 5, 3, 4, 5] numbers.copyWithin(0, 3, 4); // [4, 2, 3, 4, 5] numbers.copyWithin(-2, -3, -1); // [1, 2, 3, 3, 4] [].copyWithin.call({length: 5, 3: 1}, 0, 3); // {0: 1, 3: 1, length: 5} // ES2015 Typed Arrays are subclasses of Array var i32a = new Int32Array([1, 2, 3, 4, 5]); i32a.copyWithin(0, 2); // Int32Array [3, 4, 5, 4, 5] // On platforms that are not yet ES2015 compliant: [].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4); // Int32Array [4, 2, 3, 4, 5]3. Array.prototype.some()
測試是否至少有一個元素通過由提供的函數實現的測試。3.1 語法
/** * @description - 測試數組的元素是否至少一個通過了指定函數的測試。 * @param callback - 用來測試每個元素的函數。 * @param thisArg - 執行 callback 時使用的 this 值。 * @return { Boolean } - 是否通過測試。 */ arr.some(callback(element[, index[, array]])[, thisArg])3.2 示例
function isBiggerThan10(element, index, array) { return element > 10; } [2, 5, 8, 1, 4].some(isBiggerThan10); // false [12, 5, 8, 1, 4].some(isBiggerThan10); // true4. Array.prototype.every()
測試數組的所有元素是否都通過了指定函數的測試。4.1 語法
/** * @description - 測試數組的所有元素是否都通過了指定函數的測試。 * @param callback - 用來測試每個元素的函數。 * @param thisArg - 執行 callback 時使用的 this 值。 * @return { Boolean } - 是否通過測試。 */ arr.every(callback[, thisArg])4.2 示例
function isBigEnough(element, index, array) { return (element >= 10); } var passed = [12, 5, 8, 130, 44].every(isBigEnough); // passed is false passed = [12, 54, 18, 130, 44].every(isBigEnough); // passed is true5. Array.prototype.flat()
會按照一個可指定的深度遞歸遍歷數組,并將所有元素與遍歷到的子數組中的元素合并為一個新數組返回。5.1 語法
/** * @description - 會按照一個可指定的深度遞歸遍歷數組,并將所有元素與遍歷到的子數組中的元素合并為一個新數組返回。 * @param depth - 指定要提取嵌套數組的結構深度, 默認值為 1。 * @return { array } - 一個包含將數組與子數組中所有元素的新數組。 */ arr.flat(depth)5.2 示例
var arr1 = [1, 2, [3, 4]]; arr1.flat(); // [1, 2, 3, 4] var arr2 = [1, 2, [3, 4, [5, 6]]]; arr2.flat(); // [1, 2, 3, 4, [5, 6]] var arr3 = [1, 2, [3, 4, [5, 6]]]; arr3.flat(2); // [1, 2, 3, 4, 5, 6] //使用 Infinity 作為深度,展開任意深度的嵌套數組 arr3.flat(Infinity); // [1, 2, 3, 4, 5, 6] // 會移除數組中的空項 var arr4 = [1, 2, , 4, 5]; arr4.flat(); // [1, 2, 4, 5]6. Array.prototype.flatMap()
首先使用映射函數映射每個元素,然后將結果壓縮成一個新數組。它與 map 和 深度值1的 flat 幾乎相同,但 flatMap 通常在合并成一種方法的效率稍微高一些。6.1 語法
/** * @description - 使用映射函數映射每個元素,然后將結果壓縮成一個新數組。 * @param callback - 可以生成一個新數組中的元素的函數,可以傳入三個參數: * @param currentValue - 當前正在數組中處理的元素。 * @param index - 可選的。數組中正在處理的當前元素的索引。 * @param array - 可選的。被調用的 map 數組。 * @param thisArg - 可選的。執行 callback 函數時 使用的this 值。 * @return { array } - 一個新的數組,其中每個元素都是回調函數的結果,并且結構深度 depth 值為1。 */ arr.flatMap(function callback(currentValue[, index[, array]]) { // 返回新數組的元素 }[, thisArg])6.2 示例
let arr = ["今天天氣不錯", "", "早上好"] arr.map(s => s.split("")) // [["今", "天", "天", "氣", "不", "錯"],[""],["早", "上", "好"]] arr.flatMap(s => s.split("")); // ["今", "天", "天", "氣", "不", "錯", "", "早", "上", "好"]7. Array.prototype.includes()
用來判斷一個數組是否包含一個指定的值,根據情況,如果包含則返回 true,否則返回false。7.1 語法注意:對象數組不能使用includes方法來檢測。
/** * @description - 用來判斷一個數組是否包含一個指定的值。 * @param valueToFind - 需要查找的元素值。 * @param fromIndex - 可選的。從fromIndex 索引處開始查找 valueToFind。如果為負值,則按升序從 array.length + fromIndex 的索引開始搜 (即使從末尾開始往前跳 fromIndex 的絕對值個索引,然后往后搜尋)。默認為 0。 * @return { Boolean } - 是否包含。 */ arr.includes(valueToFind[, fromIndex])7.2 示例
[1, 2, 3].includes(2); // true [1, 2, 3].includes(4); // false [1, 2, 3].includes(3, 3); // false [1, 2, 3].includes(3, -1); // true [1, 2, NaN].includes(NaN); // true8. Array.prototype.lastIndexOf()
返回指定元素(也即有效的 JavaScript 值或變量)在數組中的最后一個的索引,如果不存在則返回 -1。從數組的后面向前查找,從 fromIndex 處開始。8.1 語法
/** * @description - 返回指定元素在數組中的最后一個的索引。 * @param searchElement - 被查找的元素。 * @param fromIndex - 可選的。從此位置開始逆向查找。 * @return { Boolean } - 是否包含。 */ arr.lastIndexOf(searchElement[, fromIndex = arr.length - 1])8.2 示例
var array = [2, 5, 9, 2]; var index = array.lastIndexOf(2); // index is 3 index = array.lastIndexOf(7); // index is -1 index = array.lastIndexOf(2, 3); // index is 3 index = array.lastIndexOf(2, 2); // index is 0 index = array.lastIndexOf(2, -2); // index is 0 index = array.lastIndexOf(2, -1); // index is 39. Array.prototype.reduce()
對數組中的每個元素執行一個由您提供的reducer函數(升序執行),將其結果匯總為單個返回值。9.1 語法
/** * @description - 對數組中的每個元素執行一個由您提供的**reducer**函數(升序執行),將其結果匯總為單個返回值。 * @param callback - 執行數組中每個值的函數,包含四個參數: * @param accumulator - 累計器累計回調的返回值; 它是上一次調用回調時返回的累積值,或initialValue。 * @param currentValue - 當前正在數組中處理的元素。 * @param index - 可選的。數組中正在處理的當前元素的索引。 * @param array - 可選的。被調用的 map 數組。 * @param initialValue - 可選的。作為第一次調用 callback函數時的第一個參數的值。 如果沒有提供初始值,則將使用數組中的第一個元素。 在沒有初始值的空數組上調用 reduce 將報錯。 * @return - 函數累計處理的結果。 */ arr.reduce(callback[, initialValue])9.2 示例
// 數組中最大值 var arr = [10, 0, 100, 99, 48, 101]; var reducer = (x, y) => Math.max(x, y); arr.reduce(reducer); // 101 // 累加 var reducer2 = (x, y) => x + y; arr.reduce(reducer2); // 358
這里我們可以看看累加的運行過程:
callback(也就是reducer2) | accumulator | currentValue | 返回值 |
---|---|---|---|
1 | 0 | 10 | 10 |
2 | 10 | 0 | 10 |
3 | 10 | 100 | 110 |
4 | 110 | 99 | 209 |
5 | 209 | 48 | 257 |
6 | 257 | 101 | 358 |
如果我們將 initialValue 這個參數也傳入進去,我們再看一下效果:
var arr = [10, 0, 100, 99, 48, 101]; // 累加 var reducer2 = (x, y) => x + y; // initialValue,作為第一次調用 callback 函數時的第一個參數的值。 // 也就是說第一次調用 callback 的時候 x 的值就是10了。 arr.reduce(reducer2, 10); // 368
callback(也就是reducer2) | accumulator | currentValue | 返回值 |
---|---|---|---|
1 | 10 | 10 | 20 |
2 | 20 | 0 | 20 |
3 | 20 | 100 | 120 |
4 | 120 | 99 | 219 |
5 | 219 | 48 | 267 |
6 | 267 | 101 | 368 |
返回一個新的Array Iterator對象,該對象包含數組中每個索引的鍵/值對。10.1 語法
/** * @description - 返回一個新的Array Iterator對象,該對象包含數組中每個索引的鍵/值對。 * @return { Array Iterator } - 一個新的 Array 迭代器對象。 */ arr.entries()10.2 示例
var arr = ["a", "b", "c"]; var iterator = arr.entries(); console.log(iterator); /* Array Iterator {} __proto__:Array Iterator next:? next() Symbol(Symbol.toStringTag):"Array Iterator" __proto__:Object */ for (let e of iterator) { console.log(e); } // [0, "a"] // [1, "b"] // [2, "c"]
注:以上大部分都是在文檔里面的,只是個人平時使用筆記少或者沒用過的,然后統一做個記錄。貌似還都是ES6的,都9102年了,趕緊用起來!小廣告意思就是抄襲了一下文檔,大佬輕噴!
我自己運營的公眾號,記錄我自己的成長!
公眾號:前端曰
公眾號ID:js-say
ps:是(yue)不是(ri)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104198.html
摘要:前言最近看了一些同學的面經,發現無論什么技術崗位,還是會問到和的區別,而搜索出來的答案并不能讓我們裝得一手好逼,那就讓我們從報文的角度來擼一波,從而搞明白他們的區別。所以,和分開發送是部分瀏覽器或框架的請求方法,不屬于必然行為。 1 前言 最近看了一些同學的面經,發現無論什么技術崗位,還是會問到 get 和 post 的區別,而搜索出來的答案并不能讓我們裝得一手好逼,那就讓我們從 HT...
摘要:前言最近看了一些同學的面經,發現無論什么技術崗位,還是會問到和的區別。所有學技術的同學都知道和函數怎么用,知道和的區別就是是儲存在服務端的,是存儲在瀏覽器的。的誕生是為了能讓無狀態的報文帶上一些特殊的數據,讓服務端能夠辨識請求的身份。 1 前言 最近看了一些同學的面經,發現無論什么技術崗位,還是會問到 Session 和 Cookie 的區別。 所有學技術的同學都知道 Session ...
摘要:聯調測試,無需依賴他人。針對以上問題,有兩種解決方法,一個是自己搭建私有服務,另一個是用云服務的鏡像管理平臺如阿里云的容器鏡像服務。利用,先對阿里云的服務進行登錄。推送后,就能在阿里云的倉庫上看到這個鏡像。 Docker簡述 Docker是一種OS虛擬化技術,是一個開源的應用容器引擎。它可以讓開發者將應用打包到一個可移植的容器中,并且該容器可以運行在幾乎所有linux系統中(Windo...
摘要:接下來,在支付寶小程序開發者工具中打,不出意外能跑起來一個電商支付寶小程序雛形。地址以上是我這個攻城獅對使用轉換原生微信小程序為支付寶小程序的一次微不足道的實踐。 showImg(https://segmentfault.com/img/bVbnCCN?w=1818&h=931);↑開局一張圖,故事全靠編↑ 從一個需求說起 作為底層的程序猿,哦不,我連猿都算不上,混的好的叫碼神,混得一...
摘要:幾個月后,申請了碼云的通過了。隨著年齡的增長,你會覺得技術不再是第一位,技術永遠是為業務來服務的。 showImg(https://segmentfault.com/img/bVbuy3x?w=720&h=405); 2019年已過去大半年,差不多也是這個時候,提交了分布式秒殺系統的第一版,查看了一下提交記錄,居然是2018年5月12日。 對于我來說,這個項目可能就是個偶然,你想想一個...
閱讀 3328·2021-11-08 13:12
閱讀 2771·2021-10-15 09:41
閱讀 1464·2021-10-08 10:05
閱讀 3311·2021-10-08 10:04
閱讀 2123·2021-09-29 09:34
閱讀 2499·2019-08-30 15:55
閱讀 2991·2019-08-30 15:45
閱讀 2600·2019-08-29 14:17