我有这个JavaScript:
function padded_array(k, value){
var a = [];
a[k] = value;
return a;
}
padded_array(3, "hello"); //=> [undefined, undefined, undefined, 'hello']
函数体中的代码可以缩短吗?
对于所有来到这里的谷歌用户 - 您可能正在寻找这个:
var pad_array = function(arr,len,fill) {
return arr.concat(Array(len).fill(fill)).slice(0,len);
}
假设这是你的数组
const yourArray = [1,2]
如果你只是想循环
4
次(也许是为了react jsx)
Array.from({length:4}) //[undefined,undefined,undefined,undefined]
Array(4).fill()//[undefined,undefined,undefined,undefined]
[...Array(4)] //[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']
如果你想排除'hello',你可以使用
new Array(count);
创建填充数组。
编辑:也许像这样?
new Array(5).concat("hello")
对于开始处的填充:
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
使用扩展运算符的另一种解决方案:
padArray = (length, value) => [...Array(length).fill(), value];
用法和你提到的一样:
padded_array(3, "hello"); //=> [undefined, undefined, undefined, 'hello']
标准 ES5 或前身中没有。当然你可以在 jQuery 中做类似
$.extend([], {"3": "hello"})
的事情;你甚至可以做
Object.create(Array.prototype, {"3": {value: "hello"} });
在裸ES5中,但它是hack,我不认为这是一个解决方案(如果你同意,你可以采用它)。
如果您的 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;
}
我知道这是一个老问题,但如果有人在这里绊倒(就像我最初那样),我想添加我的 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'))
// 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' ]
function leftPad(array, desiredLength, padding) {
array.unshift(...Array(desiredLength - array.length).fill(padding));
}
function rightPad(array, desiredLength, padding) {
array.push(...Array(desiredLength - array.length).fill(padding));
}
const myHello = ['hello'];
leftPad(myHello, 3, undefined);
// [undefined, undefined, 'hello']
const myHello2 = ['hello2'];
rightPad(myHello, 3, 0);
// ['hello2', 0, 0];