JS从非数组对象转数组的方法小结


Posted in Javascript onMarch 26, 2018

前言

本文主要汇总了一些JS从非数组对象转数组的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

Array.prototype.slice.call(obj)

该方法可以将类数组对象转换为数组,所谓类数组对象,就是含 length 和索引属性的对象

返回的数组长度取决于对象 length 属性的值,且非索引属性的值,或索引大于 length 的值都不会被返回到数组中

实锤如下

let obj = {
 '0': 3,
 '1': 13,
 '2': 23,
 '3': 33,
 'length': 3,
 'name': 330
}
let arr = Array.prototype.slice.call(obj)
// [3, 13, 23]

简洁写法 [].slice.call(obj)

Array.from(obj)

该方法可以将类数组对象和可迭代对象转换为数组

类数组对象上文已提及,何为可迭代对象?

  • Array、Set、Map 和字符串都是可迭代对象(WeakMap/WeakSet 并不是可迭代对象)
  • 字符串变成了可迭代对象,解决了编码的问题
  • 这些对象都有默认的迭代器,即具有 Symbol.iterator 属性
  • 可以用 for of 循环
  • 所有通过生成器创建的迭代器都是可迭代对象
  • document.getElementsByTagName("div") 返回的是可迭代对象但不是一个数组
    Array.isArray(document.getElementsByTagName('div')) 返回 false

通过生成器创建可迭代对象

let obj = {
 '0': 3,
 '1': 13,
 '2': 23,
 '3': 33
}

function *createIterator(obj){
 for(let value in obj){
  yield obj[value]
 }
}

let iterator = createIterator(obj)
let arr = Array.from(iterator)
// [3, 13, 23, 33]

改造对象本身,使其成为可迭代对象

默认情况下,开发者定义的对象都是不可迭代对象,但如果给 Symbol.iterator 属性添加一个生成器,则可以将其变为可迭代对象

let obj = {
 '0': 3,
 '1': 13,
 '2': 23,
 '3': 33
}

obj[Symbol.iterator] = function* () {
 for(let value in this){
  yield this[value]
 }
}

let arr = Array.from(obj)
// [3, 13, 23, 33]

判断对象是否为可迭代对象的方法

typeof obj[Symbol.iterator] === 'function'

一点延伸 for of 与 forEach 与 for in

for of 用于循环可迭代对象,包括有 Array, Set, Map, 字符串

而 Array, Set, Map 都有 forEach 方法

另外,NodeList 不是 Array, Set, Map,但是一个可迭代对象,可以用 for of 遍历

此外,用 for of 循环对象时可以通过 break 提前终止,而 forEach 无法提前跳出循环

for in 遍历对象的可枚举属性,包括其原型链上的属性,且不保证顺序

若要遍历对象自身的可枚举属性,使用 hasOwnProperty() 方法来确定属性是否时对象自身属性

Object.getOwnPropertyNames(obj) , 返回对象自身可枚举或不可枚举属性

反正已经扯远了,那就再扯远一点, Object.assign() 方法将所有可枚举属性的值从一个或多个源对象复制到目标对象

[…obj]

展开运算符可以将可迭代对象转换为数组

例如, [...'obj'] 返回 ["o", "b", "j"]

字符串去重

[...new Set('objobj')]

Object.values(obj)

默认情况下,开发者定义的对象都是不可迭代对象,但提供了返回迭代器的方法

  • entries()
  • values()
  • keys()

通过使用这些方法,可以返回相关的数组

与类数组对象需要对象有 length 值不同,Object.values(obj) 返回对象自身可枚举属性值的集合

let obj = {
 '0': 3,
 '1': 13,
 '2': 23,
 '3': 33
}
let arr = Object.values(obj) // [3, 13, 23, 33]

字符串与数组的关系

在很大程度上,可以将字符串看成字符串数组,

都有 length 属性

都有 concat() / indexOf() / includes() / slice() 方法

不过值得注意的是, string 上没有方法可以原地修改它自身的内容,都是返回新的 string

string 还有个 repeat() 方法,创建指定数量的字符串副本

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jQuery 定时局部刷新(setInterval)
Nov 19 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
Mar 05 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
JavaScript获取当前cpu使用率的方法
Dec 15 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
Nov 03 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
Feb 04 Javascript
史上最全JavaScript常用的简写技巧(推荐)
Aug 17 Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
Vue.js+Layer表格数据绑定与实现更新的实例
Mar 07 Javascript
解决在layer.open中使用时间控件laydate失败的问题
Sep 11 Javascript
Vue-cli3多页面配置详解
Mar 22 Javascript
Vue+tracking.js 实现前端人脸检测功能
Apr 16 Javascript
深入理解Node module模块
Mar 26 #Javascript
利用Console来Debug的10个高级技巧汇总
Mar 26 #Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
Mar 26 #Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
Mar 26 #Javascript
Vue中v-show添加表达式的问题(判断是否显示)
Mar 26 #Javascript
使用Vue构建可重用的分页组件
Mar 26 #Javascript
基于jQuery实现Ajax验证用户名是否可用实例
Mar 25 #jQuery
You might like
用PHP控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
PHP数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
php实现telnet功能示例
2014/04/08 PHP
php操作MongoDB类实例
2015/06/17 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
php命令行模式代码实例详解
2021/02/26 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
Javascript 中介者模式实例
2009/12/16 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
js获取url传值的方法
2015/12/18 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
详解基于webpack&gettext的前端多语言方案
2019/01/29 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
[01:53]DOTA2超级联赛专访Zhou 五年职业青春成长
2013/05/29 DOTA
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
车间统计员岗位职责
2014/01/05 职场文书
庆七一活动方案
2014/01/25 职场文书
好人好事新闻稿
2015/07/17 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
nginx访问报403错误的几种情况详解
2022/07/23 Servers