zoukankan      html  css  js  c++  java
  • 使用jQuery.makeArray() 将多种类型转换成JS原生Array

    jQuery.makeArray(obj)这个函数从名字上来看非常easy猜出它的用途:应该是用来将传入的对象转换成一个原生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 NodeList
    			var elems = document.getElementsByTagName("div");
    			// 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("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) 这样一个数组

  • 相关阅读:
    Python_Tips[3] -> sort/sorted 排序函数
    Python_Tips[2] -> 函数延后估值及字节码分析
    Python_Tips[1] -> 利用 Python 的字典实现 Switch 功能
    Python_Tips[0] -> 关于 import
    Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式
    Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式
    Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式
    JS实现网页选取截屏 保存+打印 功能(转)
    nodejs+koa2 实现一个get请求
    windwos下安装使用nginx(转)
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7111247.html
Copyright © 2011-2022 走看看