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

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

Sep 08, 2020 pm 01:21 PM
js數組

需要知道的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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

es6 陣列怎麼移除元素 es6 陣列怎麼移除元素 Jan 11, 2023 pm 03:51 PM

方法:1、用shift()刪除第一個元素,語法「陣列.shift()」;2、用pop()刪除最後一個元素,語法「陣列.pop()」;3、用splice()刪除任意位置的元素,語法「數組.splice(位置,個數)」;4、用length刪除尾部的N個元素,語法「數組.length=原數組長度-N」;5、直接賦予空數組「[ ]」來清空元素;6、用delete刪除指定下標的一個元素。

javascript如何將字串轉為數組 javascript如何將字串轉為數組 Nov 23, 2022 pm 07:28 PM

3種轉換方法:1、使用split(),可將給定字串拆分為字串數組,語法「str.split(分隔符號,數組最大長度)」;2、利用擴展運算子「... ”,可迭代字串對象,將其轉為字元數組,語法“[...str]”;3、使用Array.from(),可將字串轉為數組,語法“Array.from(str) 」。

js數組可以轉換成php數組嗎 js數組可以轉換成php數組嗎 Jun 02, 2023 am 10:06 AM

js數組可以轉換成php數組,其操作方法為:1、建立php範例檔;2、使用語法「JSON.stringify()」將js數組轉換為JSON格式的字串;3、使用語法「json_decode() 」將JSON格式字串轉為PHP數組,此處新增了參數true,表示將JSON格式字串轉換成PHP關聯數組。

js取得數組長度的方法 js取得數組長度的方法 Jun 20, 2023 pm 05:33 PM

在 JS 中取得數組長度非常簡單,每個數組都有一個 length 屬性,該屬性傳回數組的最大長度,即其值等於最大下標值加 1。由於數字下標必須小於 2^32-1,所以 length 屬性最大值等於 2^32-1。下面程式碼定義了一個空數組,然後為下標等於 100 的元素賦值,則 length 屬性傳回 101。因此,length 屬性不能體現陣列元素的實際個數。

js數組刪除某個元素有幾種方法 js數組刪除某個元素有幾種方法 Aug 02, 2023 am 10:09 AM

js陣列刪除某個元素有4種方法,分別是:1、使用splice;2、使用filter;3、使用pop方法和shift;4、使用delete關鍵字。

JS陣列排序:sort()方法怎麼用 JS陣列排序:sort()方法怎麼用 Dec 27, 2023 pm 03:40 PM

JavaScript的Array.prototype.sort()方法用於對陣列的元素進行排序。此方法是就地排序,也就是說,它修改原始數組,而不是傳回一個新的排序數組。預設情況下,sort()方法會依照字串Unicode碼點值進行排序。這意味著它主要用於字串和數字的排序,而不是用於物件或其他複雜資料類型的排序。

js數組去重的方法有哪些 js數組去重的方法有哪些 Aug 09, 2023 pm 04:47 PM

js數組去重的方法有使用Set、使用indexOf、使用includes、使用filter和使用reduce。 1.使用Set,特點是集合中的元素不會重複;2、使用indexOf,可以傳回指定元素在數組中的第一個索引位置;3、使用includes,可以用來判斷一個元素是否已經存在於數組中;4、使用filter,可以用來篩選元素;5、使用reduce,可以將陣列中的元素壓縮等等。

JavaScript怎麼求數組長度和元素總和 JavaScript怎麼求數組長度和元素總和 Sep 20, 2022 pm 02:11 PM

JavaScript中,可利用length屬性來取得數組長度,語法「數組物件.length」;可使用reduce()或reduceRight()函數來求元素總和,語法「arr.reduce(function f(pre,curr){ return pre+cur})」或「arr.reduceRight(function f(pre,curr){return pre+cur})」。

See all articles