基本数组构造的功能方法

时间:2012-08-04 12:39:57

标签: javascript functional-programming

这是我的代码,代理myArray

var myArray = [];
var i;

for(i = 0; i < 20; i += 1) {
   myArray.push(Math.random());
}

是否存在上述功能等同于没有虚拟变量i

的功能

收藏的答案

  • while(myArray.push(Math.random()) < 20);
  • $.map(Array(20), Math.random);
  • for(var myArray = []; myArray.push(Math.random()) < 20;);

5 个答案:

答案 0 :(得分:4)

不在ES5中,没有真正的功能等同于它,因为你必须有一些数量为20的东西才能将地图应用到......

var my20ElementArray = [0,1,2,3,4,5,6,7,8,9,10];
var myArray = my20ElementArray.map(Math.random);

你可以在Python中创建一个xrange-like function,但这只会在函数中隐藏这个“未使用”的变量。

答案 1 :(得分:3)

使用JavaScript 1.7,您可以使用Array comprehensions执行此任务:

var myArray = [Math.random() for each (i in range(0, 20))];

但是,使用ES5.1,您可以使用Array constructor生成任意长度的数组,然后将其映射到随机数。唯一的缺点是map()不适用于未初始化的值,因此我首先使用joinsplit生成一个空字符串数组:

var myArray = new Array(20).join(" ").split(" ").map(Math.random);

丑陋但短暂。来自Creating range in JavaScript - strange syntax的更好(但不太可理解)的想法:

var myArray = Array.apply(null, {length: 20}).map(Math.random);

从@FelixKlings注释开始,也可以使用不带i循环变量的单行代码:

for (var myArray=[]; myArray.push(Math.random()) < 20;);
// much better:
for (var myArray=[]; myArray.length < 20;) myArray.push(Math.random());

答案 2 :(得分:1)

您是否正在寻找以下内容:

function makeArray(length, def) {
    var array = [];
    var funct = typeof def === "function";
    while (array.push(funct ? def() : def) < length);
    return array;
}

然后您可以按如下方式创建数组:

var array = makeArray(100); // an array of 100 elements
var zero = makeArray(5, 0); // an array of 5 `0`s

在您的情况下,您可以执行以下操作:

var myArray = makeArray(20, Math.random);

请参阅以下小提琴:http://jsfiddle.net/WxtkF/3/

答案 3 :(得分:1)

怎么样?

它的功能风格,非常简洁。

var makeRandomArray = function(n){
    if (n == 0) return [];
    return [Math.random()].concat(makeRandomArray(n-1));
};

console.log(makeRandomArray(20))

http://jsfiddle.net/YQqGP/

答案 4 :(得分:0)

你可以尝试:

var myArray = String(Array(20)).split(',')
               .map( () => Math.random() );

或者用以下内容扩展Array原型:

Array.prototype.vector = function(n,fn){
  fn = fn || function(){return '0';};
  while (n--){
    this.push(fn());
  }
  return this;
}
// usage
var myArray = [].vector(20, () => Math.random());

或尝试一些有趣的事情:

var myArray = function a(n,fn){
  return n ? a(n-1,fn).concat(fn()) : [];
}(20, () => Math.random())

或使用Array.from(ES&gt; = 2015)

Array.from({length: 20}).map(() => Math.random())