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

时间:2011-12-06 19:15:49

标签: javascript algorithm idioms

我有这个javascript:

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

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

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

9 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:4)

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

new Array(count);

创建填充数组。

编辑:也许是这样的?

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

答案 2 :(得分:1)

不在标准ES5或前身中。当然你可以在jQuery中做$.extend([], {"3": "hello"})之类的事情;你甚至可以做到

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

在裸ES5中,但它是黑客,我不会认为这是一个解决方案(如果你没关系,你可以采用它)。

答案 3 :(得分:1)

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

function array_pad(array, length, filler)
{
    while(true)
        if(array.push(filler) >= length)
            break;
    return array;
}

答案 4 :(得分:1)

使用传播算子的另一种解决方案:

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

用法与您提到的相同:

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

答案 5 :(得分:1)

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

假设这是您的数组

const yourArray = [1,2]

如果您只想循环4次(可能是react jsx)

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

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

// unmutation option
Array.from({...yourArray, length:4}) //[1,2,undefined,undefined]

// Or, mutation the original array.
yourArray.length = 4;
Array.from(yourArray) //[1,2,undefined,undefined]

如果您确实要填写它。例如与“索引”。
重新映射

// unmutation option
// [1,'2',3, 4]
Array.from({...yourArray,length:4}, (v,i) => v ?? i+1 ) 

// Or, mutation the original array. and fill with "x"
array.yourArray.length = 4;
// [1,'2','x','x'] 
Array.from(yourArray, (v) => v ?? 'x') 

答案 6 :(得分:0)

我知道这是一个古老的问题,但是如果有人在这里绊倒(就像我最初所做的那样),我想加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 :(得分:0)

对于开始时的填充:

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 :(得分:0)

// 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' ]