这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
前言
这几天在做一个需求,需要生成一个固定长度的数组,数组的元素是从0开始,依次递增。最后我是使用for循环生成的。除了for循环,还有别的方法吗?
答案是肯定的。
这里就把这些方法总结下,方便后面查漏补缺,同时把这些知识点巩固一下。
以下的所有例子,我都是用10代替N,你可以把10改成自己需要的数字
for循环
这应该是最常规的方法,也是最容易想到的方法。
不多说,直接来看代码:
let arr = []
for(let i = 0; i < 10; i++) {
arr.push(i)
}
console.log(arr) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
那除了for循环之外,还有哪些方法呢?
Array.from
Array.from是把类数组或者可迭代对象转成真正的数组。
Array.from接受三个参数
-
obj
必填,需要转换的类数组或者可迭代对象,比如node节点,Set,Map等
-
fn
可选,回调函数,转成的数组的每个元素都会执行该回调函数
-
thisArgs
可选,执行回调函数如果需要指定this对象,可以提供该参数
这里需要注意的是,obj只要有length属性,则就会生成对应length长度的数组
所以这里我们可以写:
Array.from({length: 10}, (val, i) => i) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
另外,
我们还可以使用数组原型链上的keys方法, 这个方法返回一个Iterator接口的对象,里面的值是数组的的下标,然后再把该对象传入Array.from中
代码如下
Array.from(new Array(10).keys()) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我们还可以使用Object.keys, 这个方法是获取对象的key属性,返回一个数组。
如果对象是数组的话,则key是数组的下标
所以这里我们可以写:
Object.keys(Array.from({length: 10})) // ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
但是这里数组的元素是字符串,我们可以继续优化下
Object.keys(Array.from({length: 10})).map((val, i ) => +i) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
扩展运算符
扩展运算符,针对具有Iterator接口的对象进行展开
所以我们可以把上面的例子改下
// 因为keys()返回的都是Iterator接口的对象
[...new Array(10).keys()]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[...Array.from({length: 10}).keys()] // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
总结
以上就是我总结的快速生成1到N的数组的几种方法,当然不局限于以上这些,如果还有别的方法,欢迎评论沟通。
在上面这些方法中,最常规是for循环,但是我们也可以了解Array.form和扩展运算符的用法,多学一点总是没有错的。
希望对你们有帮助。