python创建全零数组_创建全0数组(Zerofilledarraycreation)问题
乍看之下,创建全0数组应该是⼀件不能再简单的事情了:
var arr = [0,0,0,0,0,0];
然⽽有时候需要创建出长度⽐较长的全0数组(⽐如做桶排序时就需要),这种字⾯声明可能就不太适合,因为不可能⼿打出⼏万个0。所以今天创建全0数组的时候,我⽤了以下⽅法:
var arr = new Array(10);
//这⾥等同于
//var arr = [];arr.length = 10;
arr = arr.map(function(value,index,array){
return value = 0;
});
然后对于arr⾥的元素都进⾏了++处理:
arr[i]++;
最后console.log(arr)的时候却发现,结果是:
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
当时还以为⾃⼰map函数写错了,于是想了⼀个⽅法来验证:
var arr = [1,2,3,4,5,6,7,8,9,10];
arr = arr.map(function(value,index,array){
return value = 0;
});
console.log(arr);
结果得到了[0,0,0,0,0,0,0,0,0,0];
也就是说,使⽤new⽅法声明的数组,没法⽤map⽅法初始化每⼀个值
解决
当你⽤new关键字加上某个长度来创建数组的时候,你创建的是类似于{ length: 5, __proto__: Array.prototype }的东西,⽽不是{0:0, 1:0, 2:0, 3:0 length: 3, __proto__: Array.prototype }的⼀般数组的样⼦,也就是说⾥⾯徒有数组长度,却⼀个数组元素都没有。这样在调⽤map等函数的时候,由于数组⾥没有⼀个元素,所以也就不能对数组的元素进⾏操作。
扩展
这位⽼兄的答案中附上了⼀个⾮常狂野的⽅法:
Array.apply(null, Array(5)).map(Number.prototype.valueOf,0);
这段代码可以创建出⼀个长度为5的全0数组。因为兴趣所以我搜索了其他创建全0数组的代码放在下⾯:
new Array(5+1).join('0').split('')
var ary = new Uint8Array(10);
//ES6添加的fill⽅法
var arr = new Array(10);
arr.fill(0);
当然少不了最简单粗暴的:
var arr = [];for(var n = 0; n < 100; n++) arr[n] = 0
有⽹友测试了上述⽅法的性能,结果发现原来简单粗暴的arr[n] = 0的性能是最好的,哪怕你⽤arr.push(0)都弱爆了。创建全0数组测试 -jsperf
看来有时候优(zhuang)雅(bi)的⽅法不⼀定是最好的啊python获取数组长度

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。