本文为笔者原创,之后可能随时修改,若需转载请保留此头部,以便读者追本朔源。
本文地址 : 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() 上
如上第一个循环的时候,就是用了 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]]。
不过没关系,我们可以进行一些简单的处理
//创建一个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)
// 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);
//构造器创建的undefined 集合无法遍历,那么就来转换一下
Array.from(Array(100)).map(x=>0)
//或者
Array.from({length: 100}).map(x=0)
Array.from({length:100}, x=>0)
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(Array.apply(null,{length:100}));
//笔者补充,其实可以这样
Object.keys(new Int8Array(100))
//或者这样
Object.keys(String(Array(101)));
//甚至这样
Object.keys('0'.repeat(100))
Array.from(Array(100).keys())
[...Array(100).keys()]
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]
(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)
数组总共有22种方法,本文将其分为对象继承方法、数组转换方法、栈和队列方法、数组排序方法、数组拼接方法、创建子数组方法、数组删改方法、数组位置方法、数组归并方法和数组迭代方法共10类来进行详细介绍
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组
js数组扁平化就是指将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组。 JavaScript方法包括 递归、es5 Array 的reduce函数用法、toString方法、ES6扩展运算符...
在第一篇文章中,我们介绍了 async / await 如何帮助处理异步事件,但在异步处理集合时却无济于事。在本文中,我们将研究该filter函数,它可能是支持异步函数的最直观的方法。
任何一种编程语言都具有超出基本用法的功能,它得益于成功的设计和试图去解决广泛问题。JavaScript 中有一个这样的函数: Array.from:允许在 JavaScript 集合(如: 数组、类数组对象、或者是字符串
push向数组末尾添加元素;unshift向数组开头增加元素;pop删除数组末尾一项;shift删除数组的第一项;join为数组添加指定的分隔符;slice找某一区域内的项,返回成新数组形式
在设计树形结构的数据时候,数据库一般为:id,name,parent...如果后端不处理直接返给前端,前端就需要把这个一维数组转换为树形结构数组。下面整理了下如何通过js实现一维数组转换为树形结构数组。
reduce属于javascript「synchronize同步」的array method,他就是把一整个array的所有内容,有顺序性的挤压squeeze最后变成一个值
在过去的数个月里,我注意到在我审阅的 pull request 中有四个(关于数组使用的)错误经常出现。同时,我自己也会犯这些错误,因此有了这篇文章。让我们一起学习,以确保以后能正确地使用数组方法!
当你想使用 Array.fill( ) 来填充一个全是空白对象的数组时需要特别注意。Array(length).fill({ }) 这样填充创建的数组,里面每一项{ }都完全相同
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!