【问题标题】:Is there a shortcut to create padded array in JavaScript?是否有在 JavaScript 中创建填充数组的快捷方式?
【发布时间】:2012-01-14 09:10:18
【问题描述】:

我有这个javascript:

function padded_array(k, value){
    var a = [];
    a[k] = value;
    return a;
}

padded_array(3, "hello"); //=> [undefined, undefined, undefined, 'hello']

是否可以缩短函数体中的代码?

【问题讨论】:

  • 不。这是你可以做到的尽可能短。怎么太长了?
  • 在这个例子中不是你的结果...结果是` //=> [3x empty, 'hello']`

标签: javascript algorithm idioms


【解决方案1】:

如果要排除'hello',可以使用

new Array(count);

创建填充数组。

编辑:也许像这样?

new Array(5).concat("hello")

【讨论】:

  • 这无疑是最简单、最易读、最直观的解决方案。只需使用本机构造函数(已优化)创建一个数组,最后粘贴您的值。简单的。如果您需要在每个插槽中设置一个值,请使用 Array.fill()。
【解决方案2】:

不在标准 ES5 或之前的版本中。当然,您可以在 jQuery 中执行类似 $.extend([], {"3": "hello"}) 的操作;你甚至可以做

Object.create(Array.prototype, {"3": {value: "hello"} });

在裸 ES5 中,但它是 hack,我不认为这是一个解决方案(如果你同意,你可以采用它)。

【讨论】:

    【解决方案3】:

    对于所有来到这里的谷歌员工 - 你可能正在寻找这个:

    var pad_array = function(arr,len,fill) {
      return arr.concat(Array(len).fill(fill)).slice(0,len);
    }
    

    【讨论】:

    • 这个版本节省了一点内存:function padArray(array, length, fill) { return length > array.length ? array.concat(Array(length - array.length).fill(fill)) : array; }
    • 如果您像我一样需要左填充,这可以解决问题var pad_array_left = function(arr,len,fill) { return Array(len).fill(fill).concat(arr).slice( arr.length); }
    • 我不认为这是正确的@JuroOravec。我用Array(len).fill(fill).concat(arr).slice(-(Math.max(len, arr.length)))修复了它
    • 必须同时运行它们以查看错误是什么。对于未来的读者,请使用@Pyrolistical 的解决方案。我的不适用于长度超过 len 的数组(较大的数组缩短为 len)。
    【解决方案4】:

    如果您的 JS 不支持 Array.prototype.fill()(例如 Google Apps 脚本)并且您不能使用第一个答案中的代码,您可以使用它:

    function array_pad(array, length, filler)
    {
        if(array.length < length)// [10.02.20] Fixed error that Dimitry K noticed
          while(true)
            if(array.push(filler) >= length)
              break;
        return array;
    }
    

    【讨论】:

    • -1 :这个版本的 array_pad 总是推动填充,即使 array 已经是所需的长度。我又懒又笨,不仔细看就复制粘贴,一个月后就面临后果……
    【解决方案5】:

    使用扩展运算符的另一种解决方案:

    padArray = (length, value) => [...Array(length).fill(), value];
    

    而且用法和你说的一样:

    padded_array(3, "hello"); //=> [undefined, undefined, undefined, 'hello']
    

    【讨论】:

      【解决方案6】:

      我知道这是一个旧的(呃)问题,但如果有人在这里绊倒(就像我最初做的那样),我想加我 2 美分。

      无论如何,这是我对Array.from的看法

      const padded_array = (k, value) => Array.from({ length: k }).concat(value)
      
      console.log(padded_array(3, "hello"));

      你也可以这样做:

      const padded = (arr, pad, val) => {
        arr[pad] = val
        return arr
      }
      
      console.log(padded([],3,'hello'))

      【讨论】:

        【解决方案7】:

        对于开头的填充:

        function padArrayStart(arr, len, padding){
           return Array(len - arr.length).fill(padding).concat(arr);
        }
        

        演示:

        function padArrayStart(arr, len, padding){
           return Array(len - arr.length).fill(padding).concat(arr);
        }
        console.log(...padArrayStart([1,2,3], 5, 0));//0 0 1 2 3
        console.log(...padArrayStart([4,5,6], 3, 0));//4 5 6

        用于末尾的填充:

        function padArrayEnd(arr, len, padding){
           return arr.concat(Array(len - arr.length).fill(padding));
        }
        

        演示:

        function padArrayEnd(arr, len, padding){
           return arr.concat(Array(len - arr.length).fill(padding));
        }
        console.log(...padArrayEnd(['a','b','c'], 10, 'z'));//a b c z z z z z z z
        console.log(...padArrayEnd([0, 'a', 'd'], 6, -1));//0 a d -1 -1 -1

        【讨论】:

          【解决方案8】:
          // push is faster than concat
          // mutate array in place + return array
          
          const pad_right = (a, l, f) =>
            !Array.from({length: l - a.length})
            .map(_ => a.push(f)) || a;
          
          const a = [1, 2];
          
          pad_right(a, 4, 'x');
          // -> [ 1, 2, 'x', 'x' ]
          
          a;
          // -> [ 1, 2, 'x', 'x' ]
          

          【讨论】:

            【解决方案9】:

            从 2020 年和 2021 年开始:直截了当的选择

            假设这是你的数组

            const yourArray = [1,2]
            

            如果你只想循环 4 次(也许是为了 react jsx)

            Array.from({length:4}) //[undefined,undefined,undefined,undefined]
            Array(4).fill()//[undefined,undefined,undefined,undefined]
            

            如果您想循环 yourArray 4 次,但要从已有的值开始

            // unmutation option
            Array.from({...yourArray, length:4}) //[1,2,undefined,undefined]
            
            // unmutation option, but need some calcualtion
            [...yourArray , ...Array(2)  ] //[1,2,undefined,undefined]
            [...Array(2), ...yourArray   ] //[undefined,undefined,1,2]
            
            // loop on your array several times 
            Array(3).fill(yourArray).flat() // [1, 2, 1, 2, 1, 2]
            
            // mutation the original array.
            yourArray.length = 4;
            Array.from(yourArray) //[1,2,undefined,undefined]
            
            

            如果你真的想要一个充满值的数组。前任。带有递增数字。
            重新映射它

            // unmutation option
            
            Array.from({...yourArray,length:4}, (v,i) => v ?? i+1 ) 
            // [1,'2',3, 4]
            
            // Or, mutation the original array. and fill with "x"
            array.yourArray.length = 4;
            
            Array.from(yourArray, (v) => v ?? 'x') 
            // [1,'2','x','x'] 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-11
              • 1970-01-01
              • 2014-08-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多