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.each使用详解
Jul 07 Javascript
js简单判断移动端系统的方法
Feb 25 Javascript
基于jquery实现即时检查格式是否正确的表单
May 06 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
Jun 25 Javascript
jQuery文字提示与图片提示效果实现方法
Jul 04 Javascript
js自定义QQ菜单效果
Jan 10 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
Oct 20 Javascript
详解webpack中的hash、chunkhash、contenthash区别
Jan 05 Javascript
微信小程序实现折叠与展开文章功能
Jun 12 Javascript
JavaScript JMap类定义与使用方法示例
Jan 22 Javascript
如何在JavaScript中优雅的提取循环内数据详解
Mar 04 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
Sep 14 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支持断点续传的源码
2010/05/16 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
js简单网速测试方法完整实例
2015/12/15 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
英语演讲稿范文
2014/01/03 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
《老王》教学反思
2014/02/23 职场文书
教师业务培训方案
2014/05/01 职场文书
学校德育工作总结2015
2015/05/11 职场文书
校园新闻稿范文
2015/07/18 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
详解Python为什么不用设计模式
2021/06/24 Python