是否有在JavaScript中创建填充数组的快捷方式?
我有一个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
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']