相關學習推薦:javascript影片教學
前言
從去年發現字串的replace方法有很多神奇用法的時候,就想做這個系列,但是一直沒空,也沒有想到很好的名字,就擱置了。上週五刷題的時候看評論有個解決方法是用Array.from一行解決,而且效率還挺高的。於是啃了一下文檔和博客,搞清楚了之後就想正好可以開始這個系列了。而且數組是我們開發中最常用的資料結構之一,作為產生數組的方法之一,以from開始也蠻意思。系列名字就先湊合這麼叫吧。
定義:from() 方法用於透過擁有length 屬性的物件或可迭代的物件來傳回一個數組。
語法:Array.from(object, mapFunction, thisValue)
參數 | 描述 |
object | 必需,要轉換為陣列的物件。 |
thisValue
可選,映射函數(mapFunction)中的 this 物件。
範例用法
#1. 將類別數組轉換為陣列
Array.from('hello') //["h", "e", "l", "l", "o"] Array.from(new Set(['name','age'])) //["name", "age"] Array.from({name:'lgc',age:25}) //[] let map=new Map() map.set('name','lgc') map.set('age',25) Array.from(map) //[["name", "lgc"],["age", 25]] function test(){ console.log(Array.from(arguments)) } test(1,2,3) //[1, 2, 3]复制代码
2. 陣列深層拷貝(一行程式碼)
function clone(arr){ return Array.isArray(arr) ? Array.from(arr, clone):arr } let arrayA=[[1,2],[3,4]] let arrayB=clone(arrayA) arrayA===arrayB //false arrayA[0]===arrayB[0] //false复制代码
3. 陣列去重
function unique(arr){ return Array.from(new Set(arr)) }复制代码
4. from的其他用法
再看一次from定義:from() 方法用於透過擁有length
屬性的物件或可迭代的物件來傳回一個陣列。擁有length就行?試試看Array.from({length:2},(val,index)=>index) //[0,1]复制代码
可以,那他有什麼用呢?第一,像上面程式碼,可以很方便產生在一定範圍,有一定規則的陣列
Array.from({length:3},(val,index)=>index*10) //[0,10,20]复制代码
第二,陣列的初始化。例如你想產生指定長度的物件數組。第一反應是什麼? fill嗎?
let testArr=Array(3).fill({}) testArr[0]===testArr[1] //true复制代码
let testArrb=Array.from({length:3},()=>({})) testArrb[0]===testArrb[1] //false复制代码
5. from的進階用法
上面的內容其實層層遞進下來都是為了更好的理解下面的解題思路。 LeetCode第867題:給定一個矩陣A, 傳回 A
的轉置矩陣。矩陣的轉置是指將矩陣的主對角線翻轉,交換矩陣的行索引與列索引。 範例1: 輸入:[[1,2,3],[4,5,6],[7,8,9]] 輸出:[[1,4,7],[2, 5,8],[3,6,9]] 範例2: 輸入:[[1,2,3],[4,5,6]] 輸出:[[1,4],[2,5], [3,6]]
當時第一個反應這就不是索引互換嗎?賊簡單。於是寫瞭如下程式碼
var transpose = function(A) { let x=A.length let y=A[0].length for(let i=0;i<x;i++){ for(let j=0;j<y;j++){ if(j-i>0){ [A[i][j],A[j][i]]=[A[j][i],A[i][j]] } } } return A };复制代码
var transpose = function(A) { return Array.from({length:A[0].length},(_v,i)=>A.map(v=>v[i]))};复制代码
以上是需要知道的JS數組之Array.from的詳細內容。更多資訊請關注PHP中文網其他相關文章!