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

Posted

技术标签:

【中文标题】是否有在 JavaScript 中创建填充数组的快捷方式?【英文标题】:Is there a shortcut to create padded array in 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']` 【参考方案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'] 

【讨论】:

以上是关于是否有在 JavaScript 中创建填充数组的快捷方式?的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中创建一个对象数组,然后获取属性

是否可以在 javascript/jquery 中创建一个空的多维数组?

创建零填充 JavaScript 数组的最有效方法是啥?

有没有人有在 MATLAB 中创建共享库的经验?

如何在 mex 结构中设置向量元素

如何在 Javascript 中创建多维数组? [复制]