首頁  >  文章  >  web前端  >  jQuery中.makeArray()如何實作將多種型別轉換成JS原生Array的實例分析

jQuery中.makeArray()如何實作將多種型別轉換成JS原生Array的實例分析

黄舟
黄舟原創
2017-07-19 09:24:531355瀏覽

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

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

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

將HTMLCollection轉換成原生Array

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

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

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

經過實驗發現elems可以用名稱和陣列來索引,結論:在chrome中透過document.getElementsByTagName("p")傳回的是一個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包裹的陣列這麼一個玩意兒嗎?

不過肯定接觸過,例如透過$('p')得到一組p,這一組p就是一個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的實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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