首頁 >web前端 >js教程 >需要知道的JS數組之Array.from

需要知道的JS數組之Array.from

coldplay.xixi
coldplay.xixi轉載
2020-09-08 13:21:122955瀏覽

需要知道的JS數組之Array.from

相關學習推薦:javascript影片教學

前言

從去年發現字串的replace方法有很多神奇用法的時候,就想做這個系列,但是一直沒空,也沒有想到很好的名字,就擱置了。上週五刷題的時候看評論有個解決方法是用Array.from一行解決,而且效率還挺高的。於是啃了一下文檔和博客,搞清楚了之後就想正好可以開始這個系列了。而且數組是我們開發中最常用的資料結構之一,作為產生數組的方法之一,以from開始也蠻意思。系列名字就先湊合這麼叫吧。

  • 基礎語法

定義:from() 方法用於透過擁有length 屬性的物件或可迭代的物件來傳回一個數組。

語法:Array.from(object, mapFunction, thisValue)

必需,要轉換為陣列的物件。
參數 描述

object

mapFunction
  • 可選,陣列中每個元素要呼叫的函數。

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]复制代码

這是我們平常最常用的功能,寫這些範例的時候我還奇怪:為什麼map能轉成陣列而object只能轉為空數組。當我查看菜鳥教程,看到上述定義我才明白。 object既沒有length也不是可迭代對象,我之前以為object也是可迭代對象,畢竟都可以用for-in嘛。但其實es6的object不是可迭代對象,這裡不多贅述,有興趣的同學可以去查一下。

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复制代码

這裡主要用到了Array.from的第二個參數mapFunction,mapFunction預設傳兩個參數,陣列的值和下標。

3. 陣列去重

 

function unique(arr){
    return Array.from(new Set(arr))
}复制代码

這也是from最基本,也是我們最常用的功能之一。

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
};复制代码
###執行程式碼:通過,提交:失敗。臥槽?看一下錯誤提示,發現忽略了範例2這種,「長寬」不等的情況。轉換思路,內外循環翻轉。最外循環每執行一次即一列當做行。執行,通過。 ######不過這版看起來太撈了,而且執行時間太慢。但畢竟自己實現了,可以去留言區找其他想法。 ######下面這個就是看評論區大神實現,第一次都沒看懂。 ###
var transpose = function(A) {    return Array.from({length:A[0].length},(_v,i)=>A.map(v=>v[i]))};复制代码
###{length:A[0].length},是以給定矩陣的寬度作為轉置矩陣的長,為了滿足「擁有###length### 屬性的物件」這一條件。 (_v,i)=>A.map(v=>v[i]),取給定矩陣的列作為轉置矩陣的行。核心想法和我第二版是一樣的,但是實現方式和技巧就秀太多了。而且執行時間也較短,膜拜大神。 #########想了解更多程式設計學習,請關注###php培訓###欄位! ##########

以上是需要知道的JS數組之Array.from的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除