基本数组构造的函数方法

IT技术 javascript functional-programming
2021-02-20 07:45:18

这是我的代码,作用于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个回答

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

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

您可以在 Python 中创建一个类似 xrange 的函数,但这只会将这个“未使用”的变量隐藏在函数中。

@pimvdb:请参阅我对此的(丑陋)解决方案的回答
2021-04-22 07:45:18
你甚至可以尝试 Array.from({ length: 10 }, Math.random)
2021-04-22 07:45:18
可惜.map不处理稀疏数组,否则可能是new Array(20).map(Math.random).
2021-05-09 07:45:18
但是jQuery.map,以防万一OP正在使用它。$.map(new Array(20), Math.random)
2021-05-19 07:45:18

在 JavaScript 1.7 中,您可以使用数组推导式来完成此任务:

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

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

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

丑,但很短。在 JavaScript 中创建范围的一个可能更好(但不太容易理解)的想法- 奇怪的语法

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());
这将使所有数组元素成为相同的随机数。
2021-05-04 07:45:18
@AaditMShah 如果Math.random立即调用理解语法,那将毫无用处。“正常”列表推导式将使用引用循环变量的表达式,以便为每个(组合)循环变量计算不同的项目。如果先计算项表达式然后简单地重复,则向语言添加理解语法是没有意义的。
2021-05-08 07:45:18
我没有写数组理解,因为它是 ES.next 的一个特性,我希望代码能在今天的平台上运行,但是,是的,一个很好的解决方案:)
2021-05-12 07:45:18
@AaditMShah:哪一个?我不这么认为。草案读取不同的,我测试过其他两个。
2021-05-12 07:45:18
@Bergi - 我的错误。我预计Math.random会立即被调用。
2021-05-21 07:45:18

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

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/

这个怎么样?

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

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

console.log(makeRandomArray(20))

http://jsfiddle.net/YQqGP/

你可以试试:

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>=2015)

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