如何用ES6实现从指定数字倒序计数至0的数组生成?
如何用ES6实现从指定数字倒序计数到0的数组?
你之前用for循环实现倒序计数数组完全没问题,但用ES6写法时踩了个小坑——生成的数组少了0对吧?咱们先看看你原来的ES6代码为啥会缺0:
你写的这段代码:
const values = [...Array(5)].map((_,i) => i+1); console.log(values); // 输出 [1,2,3,4,5] const reverseValues = [...values].reverse(); console.log(reverseValues); // 输出 [5, 4, 3, 2, 1]
问题出在Array(5)生成的是长度为5的空数组,map的时候索引i从0到4,加上1后就变成了1到5,反转自然就没0了。
下面给你几种优雅的ES6解决方案:
- 方案一:调整数组长度+映射计算
直接让数组长度为startNum + 1,这样就能覆盖到0,再通过映射计算得到倒序序列:
const countDown = (startNum) => [...Array(startNum + 1)].map((_, i) => startNum - i); console.log(countDown(5)); // 预期输出: [5, 4, 3, 2, 1, 0]
原理:Array(startNum + 1)生成包含startNum+1个元素的数组(比如startNum=5时是6个),map中startNum - i会把索引0到5转换成5到0。
- 方案二:用Array.from简化写法
Array.from可以直接接收长度参数和映射函数,代码更直观:
const countDown = (startNum) => Array.from({ length: startNum + 1 }, (_, i) => startNum - i); console.log(countDown(5)); // 预期输出: [5, 4, 3, 2, 1, 0]
- 方案三:先生成正序数组再反转
先拿到0到startNum的正序数组,再反转得到结果,逻辑非常清晰:
const countDown = (startNum) => [...Array(startNum + 1).keys()].reverse(); console.log(countDown(5)); // 预期输出: [5, 4, 3, 2, 1, 0]
原理:Array(startNum +1).keys()会返回一个包含0到startNum的迭代器,扩展成数组后反转就得到倒序序列。
内容的提问来源于stack exchange,提问作者Mamunur Rashid
相关产品推荐
相关产品推荐

