首页 > 其他分享 >类数组对象转换为数组

类数组对象转换为数组

时间:2024-03-31 14:11:59浏览次数:32  
标签:slice 转换 对象 call 数组 Array children

<!-- HTML结构 -->
<ol id="test-list">
    <li class="lang">Scheme</li>
    <li class="lang">JavaScript</li>
    <li class="lang">Python</li>
    <li class="lang">Ruby</li>
    <li class="lang">Haskell</li>
</ol>
<script>
    var children = document.getElementById('test-list').children;
</script>

方法1:使用 Array.from(children)

var childrenArray = Array.from(children);

方法2:扩展运算符(spread operator)[...]

var childrenArray = [...children];

方法3:Array.prototype.slice.call(children) 

这种方法在旧版本的 JavaScript 中更常见,因为 Array.from() 是在 ECMAScript 6 中引入的。

var childrenArray = Array.prototype.slice.call(children);

Array.prototype.slice.call(children) 是一个常见的用法,用于将类数组对象(如 DOM 元素集合)转换为真正的数组。下面是这个表达式的详解:

  1. Array.prototype.slice

    • slice() 是 JavaScript 中数组对象的方法,用于提取数组的一部分,并返回一个新数组,而不修改原始数组。它通常被用来创建数组的浅拷贝。
    • 使用 call() 方法,我们可以在任意对象上调用一个指定的函数,并且将其参数作为对象的属性。在这种情况下,我们在数组原型对象上调用了 slice() 方法。
  2. call(children)

    • call() 是 JavaScript 中所有函数对象的方法,它允许你在一个对象上调用一个方法。它的第一个参数指定了函数调用时的上下文(即 this 关键字指向的对象),后续的参数将作为函数的参数传递进去。
    • 在这个表达式中,我们将 children 作为 slice() 方法的上下文对象。这意味着在 slice() 方法中,this 将指向 children 对象。
  3. Array.prototype.slice.call(children)

    • 通过结合前两步,我们实际上在 children 对象上调用了 slice() 方法。由于 children 是一个类数组对象(NodeList),它并不是一个真正的数组,因此我们无法直接使用 slice() 方法。
    • 但是通过在 slice() 方法上调用 call(children),我们将 slice() 方法的执行上下文(即 this)设置为 children,使得 slice() 方法认为它是在一个数组上被调用的。

综上所述,Array.prototype.slice.call(children) 的效果是将 children 转换为一个真正的数组,并且在这个过程中保留了数组的顺序。这个数组包含了 children 中的所有元素。

应用实例

按字符串顺序重新排序DOM节点

   <ol id="test-list">
        <li class="lang">Baby</li>
        <li class="lang">Pear</li>
        <li class="lang">Apple</li>
        <li class="lang">Zoom</li>
        <li class="lang">Coco</li>
    </ol>
    <script>
        var parent = document.getElementById('test-list')
        var childrenArray = Array.from(parent.children);
        // 按字符串顺序排序节点
        childrenArray.sort(function (a, b) {
            return a.textContent.localeCompare(b.textContent);
        });
        // 将排序后的节点重新添加到父元素中
        childrenArray.forEach(function (item) {
            parent.appendChild(item);
        });
    </script>

 

标签:slice,转换,对象,call,数组,Array,children
From: https://www.cnblogs.com/yuyanc/p/18106683

相关文章

  • 【Java编程】【算法面试题】【数组轮转】给定一个整数数组 nums,将数组中的元素向右轮
    原题:给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。例如:nums=[1,0,-1,2,3]k=1预期结果:nums=[3,1,0,-1,2]k=2预期结果:nums=[2,3,1,0,-1]以此类推。。。【本文思路解析】:1.不实用额外的数组,会多一部分开销;2.每次轮转,位置移动1位,共计移......
  • 【c++】类和对象(六)深入了解隐式类型转换
    ......
  • C语言入门:数组与指针的关系
    目录深入理解指针操作指针的基本概念指针与数组的关系指针与函数动态内存分配与释放内存分配函数内存释放函数动态内存管理注意事项深入理解指针操作、动态内存分配与释放是C语言编程中的核心技能。以下内容将进一步详细阐述这些主题,旨在帮助开发者更好地掌握指针......
  • lc3041 修改数组后最大化数组中的连续元素数目
    给定一个下标从0开始的只包含正整数的数组nums,你可以将数组中任意元素的值增加至多1,修改后,从数组中选择一个或多个元素,并确保这些元素升序排列后是连续的,求它的最大长度。将数组排序,然后从大到小处理,每个元素分别计算以它开始能得到的长度,包含它本身和加1后两种情况,递推即可。cl......
  • Python面向对象多态实现原理及代码实例
    Python面向对象编程中的多态性表示的是同一种操作可以在不同的对象上有不同的表现。多态性指的是可以无视对象的具体类型,而直接调用某个方法,这个方法会根据对象的实际类型而进行不同的操作。这是通过继承和重写方法实现的。在Python中,任何类都有一个公共的祖先:object类。Python中......
  • WinForm 程序中控件坐标之间的转换
    控件坐标系和屏幕坐标系之间的转换:如果要将一个控件上的点(例如Label或Button)的坐标(x,y)转换为屏幕上的点(x1,y1),可以使用Control.PointToScreen方法。例如:PointcontrolPoint=newPoint(x,y);PointscreenPoint=control1.PointToScreen(controlPoint);屏幕坐标......
  • 【Java编程】【算法面试题】【数组合并】以数组 intervals 表示若干个区间的集合,其中
    原始题目:以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。......
  • .Net 对象与对象之间的映射转换的6中方式以及性能对比
    我们在.Net开发的过程中,经常会遇到一个实体对象与另一个实体对象之间的映射转换,接下来我们将依次去实现6个对象间映射转换的方式,并对他们进行性能测试,找出其中效率最高的方式。通过对象Copy,通过new一个新的实体对象通过手动赋值的方式实现publicclassObjectCopyMapper{......
  • 在python中通过面向对象方式,实现烤地瓜案例
    例子:烤地瓜,不同时间,反馈不同状态,并给不同状态地瓜加入不同味道烤地瓜时间0-3分钟,生的4-7分钟,半生不熟的8-12分钟,熟了12分钟以上,已烤熟,糊了用户可以按自己的意思添加调料烤地瓜类:SweetPotato时间:cooktime状态:Cookstate调料:condiments代码实现:classSweetPot......
  • 用函数指针数组来实现对一系列函数的调用
    include<stdio.h>intadd(inta,intb);intsub(inta,intb);intmax(inta,intb);intmin(inta,intb);voidmain(){inta,b,i,k;int(*func[4])(int,int)={add,sub,max,min}//定义指针数组,并对其赋初始值printf("selectoperator(0-add,1-sub,2-max,3-min)......