是否有在JavaScript中创建填充数组的快捷方式?

是否有在JavaScript中创建填充数组的快捷方式?,javascript,algorithm,idioms,Javascript,Algorithm,Idioms,我有一个javascript: function padded_array(k, value){ var a = []; a[k] = value; return a; } padded_array(3, "hello"); //=> [undefined, undefined, undefined, 'hello'] 是否可以缩短函数体中的代码?如果要排除“hello”,可以使用 新数组(计数) 创建填充数组 编辑:也许像这样 新阵列(5).concat(“h

我有一个javascript:

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

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

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

如果要排除“hello”,可以使用

新数组(计数)

创建填充数组

编辑:也许像这样


新阵列(5).concat(“hello”)
不在标准ES5或先前版本中。当然,您可以在jQuery中执行类似于
$的操作;你甚至可以

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

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

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

如果您的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;
}
函数数组\填充(数组、长度、填充)
{
if(array.length=长度)
打破
返回数组;
}

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

padArray = (length, value) => [...Array(length).fill(), value];
用法与您提到的相同:

padded_array(3, "hello"); //=> [undefined, undefined, undefined, 'hello']
我知道这是一个老问题,但如果有人在这里绊倒了,我想加上我的2美分(就像我最初做的那样)

不管怎样,这是我的看法

const padded_array=(k,value)=>array.from({length:k}).concat(value)

log(填充的数组(3,“hello”)

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

函数padArrayStart(arr、len、padding){
返回数组(len-arr.length).fill(padding).concat(arr);
}
log(…padArrayStart([1,2,3],5,0))//0 0 1 2 3
log(…padArrayStart([4,5,6],3,0))//4 5 6
//推送比concat快
//原地变异数组+返回数组
常数pad_right=(a,l,f)=>
!from({length:l-a.length})
.map(=>a.push(f))| | a;
常数a=[1,2];
右键(a,4,'x');
//->[1,2,'x','x']
A.
//->[1,2,'x','x']
从2020年到2021年:直截了当的选项 假设这是您的数组

const yourArray = [1,2]
如果您只想循环
4次(可能对于react jsx)

如果要循环
数组
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]

如果您确实想要一个充满值的数组。例如,带有增量编号。
重新映射它


不。这差不多是你能做的最短的了。怎么会太长?这不是你在这个例子中的结果。。。结果是`/=>[3x empty,'hello']`这个版本节省了一点内存:
函数padary(array,length,fill){return length>array.length?array.concat(array(length-array.length).fill(fill)):array;}
如果你像我一样需要左填充,这就完成了
var pad\u array\u left=函数(arr,len,fill){return array(len).fill(fill).concat(arr).slice(arr.length);}
-1:这个版本的数组_pad总是推送填充,即使数组已经达到了所需的长度。我太懒了,太笨了,没有仔细看就复制粘贴了它,一个月后就会面临后果。。。
// 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']