【问题标题】:default array values默认数组值
【发布时间】:2011-01-03 22:11:24
【问题描述】:

有没有办法在javascript中为数组分配默认值?

例如:an array with 24 slots that defaults to 0

【问题讨论】:

标签: javascript arrays


【解决方案1】:

您可以在数组上使用fill 函数:

Array(24).fill(0)

注意:fill 仅在 ECMAScript 2015 中引入(别名“6”),因此截至 2017 年浏览器支持仍然非常有限(例如没有 Internet Explorer)。

【讨论】:

    【解决方案2】:
    var a = Array.apply(null, Array(24)).map(function() { return 0 });
    
    // or:
    var a = Array.apply(null, Array(5)).map(Boolean).map(Number);
    

    【讨论】:

    • 第一个数组如何允许映射?你构造数组的方式允许地图工作,而它通常不会
    【解决方案3】:
    Array.prototype.repeat= function(what, L){
     while(L) this[--L]= what;
     return this;
    }
    

    var A= [].repeat(0, 24);

    警报(A)

    【讨论】:

    • 奇怪的(Javascript 方面的)命名约定是怎么回事? (@大写字母的使用。)
    • 假设我想这样做,但是有一个对象数组,我该怎么做? var A = [].repeat(new myObject(), 10) 只是复制引用而不是每次都实例化一个新对象
    • @Morten repeat = function(what, count, isFactory) { ... }; [].repeat(function() { return new myObject(); }, 10, true);
    • 这已经很晚了,但我只想对以后阅读这篇文章的人补充一点:不要称它为repeat,因为 ES6 实现repeat 方法,这意味着您将覆盖默认行为,这是不鼓励的。不过很好的解决方案。
    • deadrunk 下面的答案更好,它不会改变数组原型,而是做同样的事情。
    【解决方案4】:

    有点啰嗦,但很管用。

    var aray = [ 0, 0, 0, 0, 0, 0,
                 0, 0, 0, 0, 0, 0,
                 0, 0, 0, 0, 0, 0,
                 0, 0, 0, 0, 0, 0 ];
    

    【讨论】:

    • @KnickerKicker - 不,对于一次性的 24 元素数组,我可能会这样做。如果它是大量的项目或者我反复需要它,那么我会更聪明。
    • 实际上,这并没有回答“有没有办法在 javascript 中为数组分配默认值?”这个问题。这个答案所解决的是一个明确的例子。
    • 迄今为止创建具有 24 个零的数组的最有效和最简洁的方法。
    【解决方案5】:

    最好和最简单的解决方案是:

    Array(length of the array).fill(a default value you want to put in the array)
    

    例子

    Array(5).fill(1)
    

    结果是

    [1,1,1,1,1]
    

    你可以放任何你喜欢的东西:

    Array(5).fill({name : ""})
    

    现在如果你想改变数组中的一些当前值 你可以使用

    [the created array ].fill(a new value , start position, end position(not included) )
    

    喜欢

    [1,1,1,1,1].fill("a",1,3)
    

    输出是

    [1, "a", "a", 1, 1]
    

    【讨论】:

      【解决方案6】:

      如果您使用“非常现代”的浏览器(查看compatibility table),您可以依赖fill

      var array = new Array(LENGTH);
      array.fill(DEFAULT_VALUE);
      

      由于多种原因,new Array() 的使用不受很多开发人员的欢迎;所以你可以这样做:

      var array = [];
      for(var i=0; i<LENGTH; ++i) array.push(DEFAULT_VALUE);
      

      后者更兼容,正如您所见,两种解决方案都由两行代码表示。

      【讨论】:

        【解决方案7】:

        我个人使用:

        function replicate (n, x) {
          var xs = [];
          for (var i = 0; i < n; ++i) {
            xs.push (x);
          }
          return xs;
        }
        

        例子:

        var hellos = replicate (100, "hello");
        

        【讨论】:

          【解决方案8】:

          如果您使用的是 ES6 及更高版本,则可以使用

          new Array(24).fill(0);
          

          这也有效:

          Array.from({ length: 24}, () => 0)
          

          【讨论】:

            【解决方案9】:

            没有。

            你必须使用循环。

            var a = new Array(24);
            for (var i = a.length-1; i >= 0; -- i) a[i] = 0;
            

            【讨论】:

            • 技术上它仍然是一个循环,移到一个函数中。
            【解决方案10】:

            现在,更聪明:)
            @见JavaScript Array reference
            Example on JSFiddle

            var len = 100;
            var ch = '0';
            alert ( new Array(len).join( ch ) );
            

            【讨论】:

            • 这是一个版本,可以根据问题的要求为您提供数字:Array(24).join().split('').map(function(){return 0})
            【解决方案11】:

            实现相同的另一种方法 -

            Array.from(Array(24),()=&gt;5)

            Array.from 接受第二个参数作为其映射函数。

            【讨论】:

              【解决方案12】:

              使用Lodash (https://lodash.com/docs),这是一个强大的数组操作库,也可用于浏览器。

              var _ = require('lodash');
              var A = _.fill(Array(24), 0);
              

              【讨论】:

                【解决方案13】:
                [].fill.call({ length: 24 }, 0);
                

                【讨论】:

                  【解决方案14】:

                  最简单的一个:

                  myArray = new Array(24).fill(0)
                  

                  【讨论】:

                  【解决方案15】:

                  我在下面使用的语法是基于 ECMA Script 6/es6

                  让 arr=[];

                  arr.length=5; //数组的大小;

                  [...arr].map(Boolean).map(Number); //三点运算符称为 spread Operator 在 ECMA Script 6 中引入

                  ------------另一种方式-------------

                  让 variable_name=new Array(size).fill(initial_value)

                  比如 arr=new Array(5).fill(0) //es6中也引入了fill方法

                  根据 ECMA 5 或 es5

                  的另一种方式

                  var variable_name=Array.apply(null,Array(size)).map(Boolean).map(Number)

                  var arr=Array.apply(null,Array(5)).map(Boolean).map(Number);

                  所有这些都会给你相同的结果: [0,0,0,0,0]

                  【讨论】:

                    【解决方案16】:
                    (new Array(5).toString().replace(/,/g, "0,") + "0").split(",")
                    
                    // ["0", "0", "0", "0", "0"]
                    

                    【讨论】:

                    • 我不知道为什么这会被赞成。他要求一个充满 0 的数组,而不是 0 的字符串版本。加上这段代码写得很糟糕,当你可以做 var a = new Array(6).join(0).split('') 时,为什么要使用正则表达式替换?
                    【解决方案17】:

                    如果您想要 BigO(1) 而不是 BigO(n),请查看以下解决方案:

                    数组的默认值为undefined。所以如果你想设置默认为0,你必须循环数组的所有元素将它们设置为0。

                    如果你必须这样做,没关系。但是我认为如果您在想要获取元素的值时检查该值会更好。

                    定义一个函数'get':获取数组的值。 myArray[index],如果 myArray[index] 未定义,则返回 '0',否则返回值。

                    const get = (arr, index) => {
                      return arr[index] === undefined ? 0 : arr[index];
                    }
                    

                    用途:

                    const myArray = ['a', 'b', 1, 4];
                    get(myArray, 2); // --> 'b' 
                    get(myArray, 102344); // --> 0;
                    

                    【讨论】:

                    • function get (i) { return 0; }
                    • 我的解决方案的大 O 是 O(1) 另一种方法总是有 O(n)
                    猜你喜欢
                    • 1970-01-01
                    • 2011-10-28
                    • 2011-11-29
                    • 2014-05-09
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多