使用 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 │
*└─────────┴───┴───┴───┴───┴───┴───┘
*/
假设所有数组的大小都相同。我要做的是...
- 我会先将每一行转换成字符串。
- 然后我会在每个字符串的前后用零填充它们。
- 将它们转换回数组。
- 填充主数组前后的字符串个数,并转换为数组。
- 您可以在字符串前面加上
+
使其成为一个整数。这里 +
是一元运算符。
不确定复杂性,但我相信这应该更容易。除了两个映射之外,我没有使用任何循环将数组转换为字符串并返回数组。
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);
寻找最好的,这意味着使用 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 │
*└─────────┴───┴───┴───┴───┴───┴───┘
*/
假设所有数组的大小都相同。我要做的是...
- 我会先将每一行转换成字符串。
- 然后我会在每个字符串的前后用零填充它们。
- 将它们转换回数组。
- 填充主数组前后的字符串个数,并转换为数组。
- 您可以在字符串前面加上
+
使其成为一个整数。这里+
是一元运算符。
不确定复杂性,但我相信这应该更容易。除了两个映射之外,我没有使用任何循环将数组转换为字符串并返回数组。
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);