Javascript 基本阵列构造的函数方法

Javascript 基本阵列构造的函数方法,javascript,functional-programming,Javascript,Functional Programming,这是我的代码,作用于myArray: var myArray = []; var i; for(i = 0; i < 20; i += 1) { myArray.push(Math.random()); } var myArray=[]; var i; 对于(i=0;i

这是我的代码,作用于
myArray

var myArray = [];
var i;

for(i = 0; i < 20; i += 1) {
   myArray.push(Math.random());
}
var myArray=[];
var i;
对于(i=0;i<20;i+=1){
myArray.push(Math.random());
}
是否有与上述功能等效的功能,而不使用伪变量
i

最喜欢的答案:

  • while(myArray.push(Math.random())<20)
  • $.map(数组(20),数学随机)
  • for(var myArray=[];myArray.push(Math.random())<20;)

    • 不在ES5中,没有真正的功能等效于它,因为你必须有一个数量为20的东西来应用map

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

      您可以在Python中创建what is,但这只会将此“未使用”变量隐藏在函数中。

      您是否在寻找以下内容:

      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);
      
      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());
      

      请参阅以下内容:

      对于JavaScript 1.7,您可以使用它执行此任务:

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

      但是,在ES5.1中,您可以使用生成任意长度的数组,然后将其映射到随机数。唯一的缺点是它不能处理未初始化的值,所以我首先使用and生成一个空字符串数组:

      丑,但短。一个可能更好(但不易理解)的想法来自:


      从@FelixKlings comment开始,您也可以使用这个单行程序,而不使用
      i
      循环变量:

      for (var myArray=[]; myArray.push(Math.random()) < 20;);
      // much better:
      for (var myArray=[]; myArray.length < 20;) myArray.push(Math.random());
      
      for(var myArray=[];myArray.push(Math.random())<20;);
      //更好的是:
      对于(var myArray=[];myArray.length<20;)myArray.push(Math.random());
      
      您可以尝试:

      var myArray = String(Array(20)).split(',')
                     .map( () => Math.random() );
      
      或者使用以下内容扩展阵列原型:

      var myArray = makeArray(20, Math.random);
      
      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())
      
      或使用(ES>=2015)

      这个怎么样

      这是功能性的风格,非常简洁

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


      不过我不这么认为。您可以使用“hack”,比如
      while(myArray.push(Math.random())<20)
      @FelixKling这看起来确实比for循环简单得多,如果它真的是一个黑客行为,这可能会引起争论:)@Vatev:是的,它使用的副作用被认为不是很干净,而且肯定不是一种功能性方法。不过这很有趣:)最终你还是会把这样的代码放到函数中…@FelixKling:使用
      for
      -循环,你甚至可以内联变量声明:-)试试
      数组。从({length:20},Math.random)
      很遗憾
      .map
      不能处理稀疏数组,否则它可能是
      新数组(20).map(Math.random)
      。但是
      jQuery.map
      会这样做,以防OP正在使用它
      $.map(新数组(20),Math.random)
      @pimvdb:看看我的答案,你甚至可以尝试
      数组。从({length:10},Math.random)
      这将使所有数组元素都是相同的随机数。我没有在数组理解中编写,因为这是一个ES.next特性,我希望代码能在今天的平台上运行,但是是的,一个很好的解决方案:)@AaditMShah:哪一个?我不这么认为。两个读数不同,我已经测试了另外两个。@Bergi-我的错误。我希望立即调用
      Math.random
      。@AaditMShah如果理解语法立即调用
      Math.random
      ,那将是毫无用处的。“正常”列表理解将使用引用循环变量的表达式,以便为每个(组合)循环变量计算不同的项。如果先计算项表达式,然后简单地重复,那么向语言添加理解语法是没有意义的。
      var makeRandomArray = function(n){
          if (n == 0) return [];
          return [Math.random()].concat(makeRandomArray(n-1));
      };
      
      console.log(makeRandomArray(20))