如何快速的创建一个包含100个元素的数组

时间: 2017-12-29阅读: 2038标签: Array
​本文为笔者原创,之后可能随时修改,若需转载请保留此头部,以便读者追本朔源。
本文地址 : http://blog.zhukejin.com/archives/328

如题, 最初见到的问题是如何创建100个为元素为0 的数组,研究了一系列的方法,包含Es6 新的API ,不得不说, ES6 好强大!

如果问一个新手,那么得到的回答极有可能就是 循环,当然循环也无可厚非,毕竟能实现就行,但是我们如果闲的话,还是可以探讨一下到底有多少中方式可以解决这个问题  


循环

var arr = [];
for (var i=0; i<99; i++) {
    arr.push(0)
}
//可以吗? 当然可以。 或者使用其他的什么循环

那么有其他方法吗? 当然有。核心围绕在 new Array() 上 


Array构造器

如上第一个循环的时候,就是用了 new Array(100) 这样的构造器,但是这样创建出来的数组只是一个 undefined x 100的集合

Array(100) //[undefined × 100]

ECMAScript-262 中对 Array.prototype.map 的方法描述有一句话

callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.

在为数组中每个元素执行callbackfn之前,会先判断这个元素是否在数组中实际存在(actually exist),判断的方法就是调用内部方法[[HasProperty]]。

不过没关系,我们可以进行一些简单的处理


split分割

//创建一个100个元素的数组,此时不具有Array 的 prototype, 然后通过 join 和 split 来生成
Array(100).join(0).split('')

//或者
'0'.repeat(100).split('')

//或者
(1 << 24).toString(2).replace(/\d/g, '0000').split('')

//什么? 你说这些出来元素都是字符串?要Number ? 
Array(100).join(0).split('').map(Number)


Array.fill

// Es6 的新方法 Array.prototype.fill
Array(100).fill(0)

//tip
[].fill.call({length: 100}, 0)

//这时候就可以用 Array.from 、 Array.prototype.slice.call 来转换成数组了
Array(100).fill(0).map(x=>x);


Array.from + map

//构造器创建的undefined 集合无法遍历,那么就来转换一下
Array.from(Array(100)).map(x=>0)

//或者
Array.from({length: 100}).map(x=0)


Array.from + mapFn (from 的第二个参数)

Array.from({length:100}, x=>0)


Array.apply + map

Array.apply(null, Array(100)).map(x=>0)

//或者
Array.apply(null,{length:100}).map(x=0)


类型化数组

//它的元素默认初始化为0。
new Int8Array(100);

//甚至
Array.prototype.slice.call(new Uint8Array(100))


延伸一下,如果是求每个元素是他的下标 (部分来自知乎)

Object.keys

Object.keys(Array.apply(null,{length:100}));

//笔者补充,其实可以这样
Object.keys(new Int8Array(100))

//或者这样
Object.keys(String(Array(101)));

//甚至这样
Object.keys('0'.repeat(100))


Array.from + keys

Array.from(Array(100).keys()) 


Spread + keys

[...Array(100).keys()]


Array.from + Generator

function* angry(i) {
  yield i;
  if (i < 99) { yield* angry(i + 1); }
};
Array.from(angry(0));


变异递归

(function(v,i){if(i>0)arguments.callee(v,i-1);v.push(i);return v})([],99);


奇葩一点的方法:

Number.prototype[Symbol.iterator] = function() {
    return {
        v: 0,
        e: this,
        next() {
            return {
                value: this.v++,
                done: this.v > this.e
            }
        }
    }
}

[...100]


Y combinator (别问,知乎大神写的)

(function (excited) {
   return function (f) { 
      return f(f); 
   }(function (f) {
      return excited(function (x) { return (f(f))(x); });
   });
})(function (excited) {
   return function(i) {
       return (i < 0) ? [] : excited(i - 1).concat(i);
   }
})(99);


//换个装逼点的es6 
((excited) => ((f) => f(f))((f) => excited((x) => (f(f))(x))))((excited) => (i) => (i<0 ? [] : excited(i-1).concat(i)))(99)


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.fly63.com/article/detial/297

for in 和 for of的区别详解

for in 和 for of 相对于大家肯定都不陌生,都是用来遍历属性的没错。for ... in 循环返回的值都是数据结构的 键值名。遍历对象返回的对象的key值,遍历数组返回的数组的下标(key)。for of 循环用来获取一对键值对中的值,而 for in 获取的是 键名

JavaScript数组中的22个常用方法

数组总共有22种方法,本文将其分为对象继承方法、数组转换方法、栈和队列方法、数组排序方法、数组拼接方法、创建子数组方法、数组删改方法、数组位置方法、数组归并方法和数组迭代方法共10类来进行详细介绍

在 Array.filter 中正确使用 Async

在第一篇文章中,我们介绍了 async / await 如何帮助处理异步事件,但在异步处理集合时却无济于事。在本文中,我们将研究该filter函数,它可能是支持异步函数的最直观的方法。

数组去重_原生js对普通数组去重算法的7种方法总结

JavaScript实现普通数组去重,讲解各种算法的思想和改进方法,已经他们的优缺点...利用数组的reduce方法,使用了filter方法,利用ES6去重,相对来说更为简单

JS实现遍历不规则多维数组的方法

这篇文章主要介绍了JS实现遍历不规则多维数组的方法,涉及javascript数组递归遍历相关实现与使用技巧,需要的朋友可以参考下

Array的 every、some、filter、map的区别,以及和reduce的区别

every、some、filter、map这几个方法有时候总是傻傻分不清,尤其map,总是一下子有点懵逼记不清和其他方法的区别,每次都需要查一下API,他们的相同点都是需要遍历数组中的每一项,重点是他们的区别.

JS 将有父子关系的数组转换成树形结构数据

将有父子关系的数组数据先分为两类,一类是没有父节点的数据(取个别名parents),另一类是有父节点的数据(取个别名children),然后通过遍历parents,对每一个父节点在children查找对应的子节点,并将其放入父节点的children中(这里我的是以children表示子节点),然后每个子节点又作为一个父节点来重复之前的动作

JS中forEach的用法

orEach是ES5中操作数组的一种方法,主要功能是遍历数组,forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第二个参数是对应的数组索引,第三个参数是数组本身

Array.from() 五个超好用的用途

任何一种编程语言都具有超出基本用法的功能,它得益于成功的设计和试图去解决广泛问题。JavaScript 中有一个这样的函数: Array.from:允许在 JavaScript 集合(如: 数组、类数组对象、或者是字符串

JS取出两个数组中的不同或相同元素

concat() 方法:用于连接两个或多个数组。Array filter() 方法:创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。indexOf() 方法:可返回某个指定的字符串值在字符串中首次出现的位置。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!