跳到主要内容
CNode

不使用循环构造空数组

社区
Wwaksana发布于 12 年前最后回复 12 年前
2168270

不显试使用循环构造一个空数组,同学们有什么想法吗 那天我在stackoverflow上看到一种方法很有趣,和大家分享下。

查看回复

回复 (21)

G
gitchs#2112 年前

递归

var GenerateArray = function(i,array){
	array = array||[];
	if (i>0){
		--i;
		array.push(undefined);
		return GenerateArray(i,array);
	}
	return array;
}

var a = GenerateArray(10);
console.log(a);
console.log(a.length);
W
wh1100717#2012 年前
引用 alsotang

@alsotang 哈哈 看了觉得好玩 特意去查了一下...

A
alsotang#1912 年前
引用 alsotang

@wh1100717 碉堡了

W
wh1100717#1812 年前
引用 hackerjsArray.apply(null,Array(10)) //也可以,,

Array(10)会转换成[,,,,,,,,,],然后就是Array.apply(null, [,,,,,,,,,])了,哈哈,道理都是一样的

W
wh1100717#1712 年前
引用 alsotang

@alsotang

Object.apply(this, argumenst)传参方式是一个由各个参数组成的数组或类数组(一个有length属性的对象),传入参数个数取决于 length 的值。比如

Array.apply this, {
    0:0
    1:1
    2:2
    length:4
}
#输出为 [ 0, 1, 2, undefined ]

而这实际上是Object.apply的用法,Array只是调用而已,它不负责处理{length:10}

具体类数组相关可以参考这里 http://blog.segmentfault.com/f2e/1190000000415572

W
wh1100717#1612 年前
引用 alsotang

@waksana 这样也可以

Array.apply this, [,,,,,,,,,]
Array.apply this, Array(10)
Array.apply this, Array.apply(this, [10])
Y
youxiachai#1512 年前
引用 151263var arr = []; arr[9] = undefined;

你这个..只有一个被赋值...

J
jacklau#1412 年前

new Array(10).join(',').split(',').map(function(){return undefined});

1
151263#1312 年前

var arr = []; arr[9] = undefined;

D
dlutwuwei#1212 年前
引用 dlutwuweiarray json形式是{ length:2, 0:“”,1:“" }

@coordcn console.dir([1,2]),数组和类数组对象的序列化结果是一样的,只是数组的原型会带有很多方法,比如slice,join之类的,var args = Array.prototype.slice.call(arguments);,这个可以把类数组对象转换为数组。

W
waksana#1112 年前
引用 youxiachaiundefined 有没有办法改为 0 值呢?

构造了之后用map....map不算循环吧

Y
youxiachai#1012 年前

undefined 有没有办法改为 0 值呢?

H
hackerjs#912 年前
引用 dlutwuweiarray json形式是{ length:2, 0:“”,1:“" }

@coordcn {length:10, "0":“”,“1”:“” }, 这是“类数组”对象。

H
hackerjs#812 年前

Array.apply(null,Array(10)) //也可以,,

C
coordcn#712 年前
引用 dlutwuweiarray json形式是{ length:2, 0:“”,1:“" }

这个可以打印验证么?求代码

D
dlutwuwei#612 年前

array json形式是{ length:2, 0:“”,1:“" }

A
alsotang#512 年前
引用 alsotang

@waksana 很 trick 啊。我大概猜到了部分原理,{length:10} 被 Array 当成了一个长度为 10 的数组。于是新数组被真的逐个赋值了。

W
waksana#412 年前
引用 alsotang

@alsotang 好吧,undefined也是能运行的,不过new Array 没有真的生成10个undefine。他显示的是[undefined * 10]. 解决办法是 Array.apply(null, {length:10})

A
alsotang#312 年前
引用 alsotang

@waksana forEach 遇到 undefined 不会执行,不知遇到其他零值会不会也这样。

那你说的有趣方法呢?

W
waksana#212 年前
引用 alsotang

就是构造一个给定长度的数组,每个元素都是undefined。不用循环。 arr = new Array(n) 不可以,因为arr.forEach()里面的函数不会被执行

A
alsotang#112 年前

参与回复

登录后即可参与回复。登录