JS从非数组对象转数组的方法小结
前言
本文主要汇总了一些JS从非数组对象转数组的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
Array.prototype.slice.call(obj)
该方法可以将类数组对象转换为数组,所谓类数组对象,就是含length和索引属性的对象
返回的数组长度取决于对象length属性的值,且非索引属性的值,或索引大于length的值都不会被返回到数组中
实锤如下
letobj={ '0':3, '1':13, '2':23, '3':33, 'length':3, 'name':330 } letarr=Array.prototype.slice.call(obj) //[3,13,23]
简洁写法[].slice.call(obj)
Array.from(obj)
该方法可以将类数组对象和可迭代对象转换为数组
类数组对象上文已提及,何为可迭代对象?
- Array、Set、Map和字符串都是可迭代对象(WeakMap/WeakSet并不是可迭代对象)
- 字符串变成了可迭代对象,解决了编码的问题
- 这些对象都有默认的迭代器,即具有Symbol.iterator属性
- 可以用forof循环
- 所有通过生成器创建的迭代器都是可迭代对象
- document.getElementsByTagName("div")返回的是可迭代对象但不是一个数组
Array.isArray(document.getElementsByTagName('div'))返回false
通过生成器创建可迭代对象
letobj={ '0':3, '1':13, '2':23, '3':33 } function*createIterator(obj){ for(letvalueinobj){ yieldobj[value] } } letiterator=createIterator(obj) letarr=Array.from(iterator) //[3,13,23,33]
改造对象本身,使其成为可迭代对象
默认情况下,开发者定义的对象都是不可迭代对象,但如果给Symbol.iterator属性添加一个生成器,则可以将其变为可迭代对象
letobj={ '0':3, '1':13, '2':23, '3':33 } obj[Symbol.iterator]=function*(){ for(letvalueinthis){ yieldthis[value] } } letarr=Array.from(obj) //[3,13,23,33]
判断对象是否为可迭代对象的方法
typeofobj[Symbol.iterator]==='function'
一点延伸forof与forEach与forin
forof用于循环可迭代对象,包括有Array,Set,Map,字符串
而Array,Set,Map都有forEach方法
另外,NodeList不是Array,Set,Map,但是一个可迭代对象,可以用forof遍历
此外,用forof循环对象时可以通过break提前终止,而forEach无法提前跳出循环
forin遍历对象的可枚举属性,包括其原型链上的属性,且不保证顺序
若要遍历对象自身的可枚举属性,使用hasOwnProperty()方法来确定属性是否时对象自身属性
Object.getOwnPropertyNames(obj),返回对象自身可枚举或不可枚举属性
反正已经扯远了,那就再扯远一点,Object.assign()方法将所有可枚举属性的值从一个或多个源对象复制到目标对象
[…obj]
展开运算符可以将可迭代对象转换为数组
例如,[...'obj']返回["o","b","j"]
字符串去重
[...newSet('objobj')]
Object.values(obj)
默认情况下,开发者定义的对象都是不可迭代对象,但提供了返回迭代器的方法
- entries()
- values()
- keys()
通过使用这些方法,可以返回相关的数组
与类数组对象需要对象有length值不同,Object.values(obj)返回对象自身可枚举属性值的集合
letobj={ '0':3, '1':13, '2':23, '3':33 } letarr=Object.values(obj)//[3,13,23,33]
字符串与数组的关系
在很大程度上,可以将字符串看成字符串数组,
都有length属性
都有concat()/indexOf()/includes()/slice()方法
不过值得注意的是,string上没有方法可以原地修改它自身的内容,都是返回新的string
string还有个repeat()方法,创建指定数量的字符串副本
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。