前端练习27 不用循环生成数组

知识点

  1. 递归思路
  2. Array.from
  3. new Array参数和Array.of的区别
  4. 数组的keys()方法
  5. 数组map方法对空对象的处理

题目

完成arrWithoutLoop函数,它会被传入一个整数n作为参数,返回一个长度为n的数组,数组中每个元素的值等于它的下标。arrWithoutLoop中不能使用循环控制结构。

实现

首先想到了用Array.from方法,原来用它来填充数组,它接受两个参数,第一个参数是一个类似数组或可迭代对象,第二个参数是对新数组每个元素执行的回调函数

所以我们可以通过构造一个类数组对象{length: n}来生成一个数组,或者也可以直接构造数组(new Array(n)),生成一个n个空对象的新数组,然后通过Array.from的第二个参数生成想要的元素:

const arrWithoutLoop = (n) => Array.from({ length: n }, (value, key) => key)

为什么不能用map呢?因为map/forEach等都会跳过数组中的空对象

第二种方法

不让使用循环控制结构,可以使用递归来实现,递归的思路不难,从n-1开始插入,插入一个之后n-1,继续调用,直到n===1结束

要注意的是,如果n为0时需要特殊处理一下

const arrWithoutLoop = (n) => {
  if(n === 0) {
    return []
  }
  let result = [];
  result.unshift(n - 1);
  if (n === 1) {
    return result
  } else {
    return arrWithoutLoop(n - 1).concat(result)
  }
};

也可以换一种写法:

const arrWithoutLoop = (n, result = []) => {
  if (n === 0) {
    return [];
  }
  result.unshift(n - 1);
  if (n === 1) {
    return result;
  } else {
    return arrWithoutLoop(n - 1, result)
  }
};

另外一种方法

受到讨论区的启发,看到还有一种很巧妙的方法,现在要插入的是数组的下标,所以想到可以直接使用数组的keys方法

ES6提供三个新的方法——entries()keys()values()——用于遍历数组。它们都返回一个遍历器对象,可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

返回的迭代器对象我们可以通过for...of循环取值,也可以使用解构赋值的方法取值

const arrWithoutLoop = (n) => [...new Array(n).keys()];

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值