使用jQuery.makeArray() 將多種類型轉換成JS原生Array

來源:互聯網
上載者:User

標籤:js   javascript   jquery   

jQuery.makeArray(obj)這個函數從名字上來看很容易猜出它的用途:應該是用來將傳入的對象轉換成一個原生array

再看看官網上對它的解釋:Convert an array-like object into a true JavaScript array.(將一個類似數組對象轉換為JS原生的數組)

那麼怎麼樣的object才可以稱為"array-like object"呢?這個問題不急著回答,相信看完文章你會明白的,先看看下面的實驗

將HTMLCollection轉換成原生Array

<!doctype html><html lang="en"><head><meta charset="utf-8"><title>jQuery.makeArray demo</title><style>div {color: red;}</style><script src="//code.jquery.com/jquery-1.10.2.js"></script></head><body><div> First </div> <div> Second </div> <div> Third </div> <div> Fourth </div><script>// Returns a NodeListvar elems = document.getElementsByTagName("div");// Convert the NodeList to an Arrayvar arr = jQuery.makeArray(elems);// Use an Array method on list of dom elementsarr.reverse();$(arr).appendTo(document.body);</script></body></html>

這裡可以看到在chrome中通過document.getElementsByTagName("div")返回的是一個HTMLCollection

而非官網上所說的NodeList,特意去找了NodeList和HTMLCollection的區別:HTMLCollection 對象和 NodeList 對象很相似,但前者可能既能用名稱索引也能用數字索引,而後者只能用數字索引來訪問(當然NodeList也是“array-like object”)

經過實驗發現elems可以通過名稱和數組來索引,結論:在chrome中通過document.getElementsByTagName("div")返回的是一個HTMLCollection

HTMLCollection可以通過elems.length擷取它的長度,並且可以通過elems[0]這樣的方式來訪問其中的元素

像不像數組的訪問方式?其實它就是就一個“Array-like object”,但是它並不是js的原生數組,所以無法訪問array的native方法,比如(.pop() and .reverse())

而後面通過jQuery.makeArray(elems)轉換就得到了原生的JS數組arr,接下來就可以使用array的native方法了!


將jQuery包裹的數群組轉換成原生Array

除了HTMLCollection,還可以轉換什麼呢?聽說過jQuery包裹的數組這麼一個玩意兒嗎?

不過肯定接觸過,比如通過$(‘div‘)得到一組div,這一組div就是一個jQuery包裹的數組

又比如,通過.map()函數得到的也是一個jQuery包裹的數組,也可以length來得到長度,並通過下標索引來訪問,並且jQuery包裹的數組還可以使用jQuery提供的方法。

可以通過$.makeArray(obj)來轉換成原生Array,比如最常見的在.map()函數中得到jQuery數組之後轉換成原生array再通過join()得到結果

當然,將jQuery包裹的數群組轉換成原生數組的方法不止這一種,常見的還有.get()和.toArray()


將json對象轉換成原生Array
這一種情況稍微複雜一點,因為json對象本不是“array-like object”,所以我們需要一種轉換

還記得之前我們說的幾種“array-like object”嗎?它們都可以通過.length來得到長度,並且可以通過下標索引來訪問,比如:fakeArr.length、fakeArr[0]

那麼我們是否可以通過讓json支援這樣的方式來將它變成“array-like object”呢?

先設計一下:

要讓json支援fakeArr.length,簡單,只需要定義一個key為length的 鍵值對就OK了

而支援下標訪問似乎也可以迎刃而解,另外鍵值對都使用數字來作為key就好了~

那麼試試吧:

var fakeArray = {0: "張三", 1: "李四", 2:"朱六", length:3};var realArray = $.makeArray(fakeArray);console.log(fakeArray)console.log(realArray)realArray.reverse();console.log(realArray);

看到了嗎?成功了!這裡的realArray已經是js的原生array了,所以可以使用reverse()等native方法

需要注意的是,轉換過程中length很重要,這個length也就是決定了轉換後array的length

若將上述例子中的length指定為2,那麼轉換後的數組只有前2個元素,也就是["張三", "李四"]

若將上述例子中的length指定為4,那麼轉換後的數組並不會是我們希望的數組,而是類似於 new Array().push(fakeArray) 這樣一個數組

使用jQuery.makeArray() 將多種類型轉換成JS原生Array

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.