使用 javascript 在二维数组周围创建填充的最佳方法是什么

what is best way of creating padding around 2D array with javascript

寻找最好的,这意味着使用 javascript 在二维数组周围添加填充的最不复杂的 O(n) 方法。应该生成 'edge'。目标是将 0 添加到二维数组的边缘。下面的示例确实有效,但可能会更好。还尽量不使用双 for 循环。递归函数可能更好,注意起始数组可以是任何值,包括全 0。'fill' 只是填充中的值,可以是任何值。最后一个任意长度的二维数组呢?

let arr = [
  [1, 1, 1, 1], 
  [1, 0, 0, 1], 
  [1, 0, 0, 1], 
  [1, 1, 1, 1]
];

function addPadding(array, fill) {
    let edge = [fill,fill,fill,fill,fill,fill];
    for(let i = 0; i < array.length; i++) {
        array[i].push(0);
        array[i].unshift(0);
    }
    array.push(edge);
    array.unshift(edge);
    return array;
};

arr = addPadding(arr, 0);

console.log('Finally');
console.table(arr);

/**
* expected output
*┌─────────┬───┬───┬───┬───┬───┬───┐
*│ (index) │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │
*├─────────┼───┼───┼───┼───┼───┼───┤
*│    0    │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │
*│    1    │ 0 │ 1 │ 1 │ 1 │ 1 │ 0 │
*│    2    │ 0 │ 1 │ 0 │ 0 │ 1 │ 0 │
*│    3    │ 0 │ 1 │ 0 │ 0 │ 1 │ 0 │
*│    4    │ 0 │ 1 │ 1 │ 1 │ 1 │ 0 │
*│    5    │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │
*└─────────┴───┴───┴───┴───┴───┴───┘
*/


假设所有数组的大小都相同。我要做的是...

  1. 我会先将每一行转换成字符串。
  2. 然后我会在每个字符串的前后用零填充它们。
  3. 将它们转换回数组。
  4. 填充主数组前后的字符串个数,并转换为数组。
  5. 您可以在字符串前面加上 + 使其成为一个整数。这里 + 是一元运算符。

不确定复杂性,但我相信这应该更容易。除了两个映射之外,我没有使用任何循环将数组转换为字符串并返回数组。

let arr = [
  [1, 1, 1, 1],
  [1, 0, 0, 1],
  [1, 0, 0, 1],
  [1, 1, 1, 1]
];
arr = arr.map(a => "0" + a.join("") + "0");
const pad = "0".repeat(arr[0].length);
arr.unshift(pad);
arr.push(pad);
arr = arr.map(a => a.split("").map(n => +n));
console.table(arr);

一些更改并使其成为像您的功能一样的功能:

let array = [
  [1, 1, 1, 1],
  [1, 0, 0, 1],
  [1, 0, 0, 1],
  [1, 1, 1, 1]
];

function addPadding(arr, fill) {
  arr = arr.map(a => fill + a.join("") + fill);
  const pad = fill.repeat(arr[0].length);
  arr.unshift(pad);
  arr.push(pad);
  arr = arr.map(a => a.split("").map(n => +n));
  return arr;
}

console.table(addPadding(array, "0"));

如果我们只是想创建一些值的填充,无论是 int 还是 string,我们都可以这样做。此方法不考虑不同的填充尺寸。整体复杂度约为4.

let arr = [
    [1, 1, 1, 1], 
    [1, 0, 0, 1], 
    [1, 0, 0, 1], 
    [1, 1, 1, 1]
  ];
  
  function addPadding(array, fill) {
    const edge = Array(array.length + 2).fill(fill);
    array = array.map(a => {
        a.push(fill);
        a.unshift(fill);
        return a;
    });
    array.push(edge);
    array.unshift(edge);
    return array;
  };
  
  arr = addPadding(arr, 0);
  
  console.log('Finally');
  console.table(arr);