不使用循环,如何创建一个长度为100的数组

前言:

问题描述:在不使用循环的条件下,如何创建一个长度为100的数组,并且数组的每一个元素是该元素的下标?

这是一个比较经典的前端面试题,也可以当笔试题,咋一看,好像难度不大,实际上考察的知识点还不少,值得写篇文章来备忘!废话不多说,直接进入正文!

正文:

为了理解这道题的意思,我们先用传统的方法来实现一下:

使用for方法:

  var arr = new Array(100);
    for(var i=0;i<arr.length;i++){
        arr[i] = i;
    }
    console.log(arr);

或者是:

  var arr = new Array();
    for(var i=0;i<100;i++){
        arr.push(i);
    }
    console.log(arr);

可以得到一个0-99的数组,使用while,do while也可以实现,这里就不写了,那不用循环,怎么得到呢?

第一种:Object.keys()

  var arr = Object.keys(Array.apply(null, {length:100}))
  console.log(arr);

这里通过Array.apply(null, {length:100})创建一个长度为100的数组,尽管里面的值为undefined,然后我们使用Object.keys()方法获取数组的key值,那这里就可以get到Object.keys()方法的新技能了,你还不知道,去查查吧!

但是这里得到的数组是一个字符串数组,不是数字,所以我们需要再加工一下,字符串转数字的方法就很多了,这里用map()方法:

  var arr = Object.keys(Array.apply(null, {length:100})).map(function(item){
        return +item;
    });
    console.log(arr);

+号是一个转换格式的小技巧,你也可以使用parseInt

第二种:Array.from()

  var arr = Array.from({length:100}, (v,k) => k);
    console.log(arr);

这里使用的Array.from()方法,从类数组或可迭代的对象创建一个新数组,你不懂用法,去查查吧!

第三种:Array.keys()

  var arr = new Array(100).keys();
   console.log(Array.from(arr));

这里主要使用Array.keys()方法,获取数组的key值

第四种:Object.keys() 与 Array.from()

  var arr = Object.keys(Array.from({length:100}));
   console.log(arr);

这种方式创建的也是一个字符串数组,所以需要转一下,方式跟第一种一样

  var arr = Object.keys(Array.from({length:100})).map(function(item){
        return +item;
    });
    console.log(arr);

实现原理大致说一下,先用Array.from得到一个100值为undefined的数组,然后获取数组的key值,最终返回一个数组,不明白的可以仔细领会一下第二种和第三种

第5种:使用...扩展运算符

var arr = [...Array(100).keys()];
console.log(arr);

或者可以改写成:

var arr = [...Array.from({length:100}).keys()];
console.log(arr);

不熟悉扩展运算符的可以去es6教程里面看一下,这里就不介绍了

第6种:使用String()方法,比较特别

var arr = Object.keys(String(Array(101)));
console.log(arr);

这里需要用101位,为什么?因为在创建一个100个值的数组的时候,因为是空值数组,在将数组转成字符串的时候,实际上是存的空值之间的逗号(,),2个值才有一个逗号,3个值有2个逗号,以此类推,100个值需要101位,然后用Object.keys()

方法转成数组,弄懂前面的方法的应该知道,此时的数组是一个字符串数组,所以还需要安装方法一处理一下:

var arr = Object.keys(String(Array(100))).map(function(item){
    return +item;
});
console.log(arr);

第7种:使用Int8Array(),比较偏门

var arr = Object.keys(new Int8Array(100)).map(function(item){
    return +item;
});
console.log(arr);

需要了解原理的同学,建议看一下Int8Array()的api

第8种:setInterval方法,感觉更偏门了

  var arr = [];
    var i = 0;
    var timer = setInterval(function(){
        arr[i] = i++;
        if(i>=100){
            clearInterval(timer);
            console.log(arr);
        }
    },1);

通过定时器的思路,给数组赋值,确实很妙

第9种:受定时器启发,可以用递归调用

  var arr = [];
    var i = 0;
    function MakeArray(num){
        if(i<num){
            arr[i] = i++;
            MakeArray(num);
        }
        return arr;
    }
    console.log(MakeArray(100));

第10种:可以使用第七种的变种,请看:

  var arr = new Array(100).toString().split(‘,‘).map(function(item,index){
        return index;
    });
    console.log(arr);

我觉得这个知识点给出10种方法,应该差不多了,但是方法远远不止这10种,比如说截取网页中的100个字符,然后获取索引,比如说用二进制等等,奇淫巧技数不胜数,这里就不一一赘述了!

我觉得一个话题或者说一个命题,能够牵扯出别的知识点,学习到更多的技巧,那这个命题就是有价值的,也是有意义的,不想多说了,一张图结束今天的话题!

如果你觉得你那里有什么好的实现方式,也可以在评论中发出来给大家参考一下!

原创不易,欢迎转载,转载时请注明出处,谢谢!

时间: 2024-08-10 13:02:01

不使用循环,如何创建一个长度为100的数组的相关文章

面试题 一个长度为100的数组,随机插入1-100,不重复,写出大致思路即可;

之前回答的是: 定义一个长度为100的a数组,存1-100,每次从数组里随机的位置取一个元素,放入b数组,并且从a数组移除: 后来百度了一下,说是数组重新排列不够好,更好的做法是 每次将随机取到的数与数组 "最后一位" 交换: 想想还是有点道理,不用重新排列,而且不需要两个数组 <script> function fn(n) { var arr = []; for (var i = 0; i < n + 1; i++) { arr[i] = i + 1; } for

首先创建一个长度是5的数组,并填充随机数。首先用选择法正排序,然后再对其使用冒泡法倒排序

public class Test17 { public static void main(String[] args) { int []arr = new int[5]; for (int x = 1; x < 100; x++) { Random r = new Random(); arr[0] = r.nextInt(x); arr[1] = r.nextInt(x); arr[2] = r.nextInt(x); arr[3] = r.nextInt(x); arr[4] = r.nex

奇妙JS代码系列(三)一道有趣的题(创建一个长度为x数组)

原题描述: 不使用loop循环,创建一个长度为100的数组,并且每个元素的值等于它的下标 这个问题的一些变种例如给一个长度length和value,返回长度为length值全为value的数组等. 误区 最容易掉入陷阱的: var arr = new Array(100); arr = arr.map(function(item, index) { return index; }); 如果你的答案是这个,恭喜你成功掉入出题人的坑了. 解释 坑在Array(100),可以看看MDN的规范, new

一个简单的算法,定义一个长度为n的数组,随机顺序存储1至n的的全部正整数,不重复。

前些天看到.net笔试习题集上的一道小题,要求将1至100内的正整数随机填充到一个长度为100的数组,求一个简单的算法. 今天有空写了一下.代码如下,注释比较详细: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Text.RegularExpressions; 6 7 namespace TestNumber 8 { 9 cl

js实现从长度为100的数组中随机抽取5个不同值

方法一:这个是我的方法,望大家指正…… <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>从长度为100的数组中随机抽取5个不同值</title> </head> <body> <script> var arr = new Array(100); var flag_a =

不使用loop生成一个长度n=100,每一项的数据类型为Number,值等于其下标的数组arry。

这两天在群里看到一组uc国际的面试题,趁有空,也过了一遍,题目如下: 简单做了一下,暂时实现方法如下: ①setTimeout计时器 var i = 0,k = [],j; function count(){ if(i > 100){ clearInterval(j); console.log(k); }else{ k[i] = i++; } } j = setInterval(function(){ count(); },20); ②递归 var rr = []; function sum(n

给定一个长度为N的数组,找出出现次数大于n/2,n/3的数,要求时间复杂度O(n),空间复杂度O(1)

先讨论出现次数大于n/2的数字,如果这样的数字存在,那么这个数出现的次数大于其他数出现的次数的总和. 在数组A中,我们定义两个数据集合a1,a2.a1为出现次数大于n/2的数的集合,a2为其余数组成的集合.对于数组 A中元素a.b,假设a不等于b,那么有两种情况,分别为:a属于a1,b属于a2:a属于a2,b属于a2.对于这两种情况,如 果把a.b从数组A中去掉,集合a1的size依旧是大于a2的.按照这个思路,我们有如下代码: int m; int count = 0; for (auto n

用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据。

比如:[1, 2, 3, 3, 2, 2, 6, 7, 8, 9] 中 2 or 3 分析:这道题目,实现比较容易,方法也不少,但要用最小的空间复杂度来看的话, 和充分考虑一下数据的下标和数据元素值的特点,比如如果把第 i 个位置放的值是 i,不是的情况做交换,去循环对比. 时间复杂度O(n),空间复杂度可到常量级 测试代码如下: public static void main(String[] args) { int n=10; List<Integer> list = new ArrayL

【面试题】向一个长度为100的int数组,插入1-100的随机数,不能重复

1 public int[] GetNoRepeatArrayy(int arrLength) 2 { 3 int[] array = new int[arrLength]; 4 IList<int> list = new List<int>(); 5 //准备不重复的数据 6 for (int i = 0; i < array.Length; i++) 7 { 8 list.Add(i); 9 } 10 //将不重复的数据随机插入到数组中 11 for (int j = (