我是编程的初学者,正在寻找有关多维数组的帮助(预先感谢您的帮助!)我正在尝试在Kata
上完成Code Wars
,特别是“ xD -假人的阵列。”提示希望用户根据一组未知的参数返回多维数组。
例如,function dim( 3,3,"x" )
应该返回[['x','x','x'],['x','x','x'],['x','x','x']]
。首先,创建一个具有3个“ x”的数组(即[x, x, x]
),然后再创建3个数组来存储第一个数组(即[[x, x, x], [x, x, x], [x, x, x]]
)。要传递kata
,您将传递未知数量的参数。
我尝试创建一个迭代函数,并决定使用递归,因为我们不知道可能收到的参数数量。
到目前为止,这是我的代码...
function dim() {
// Create an array from the arguments given when the function is called
var args = Array.from(arguments);
// Store the first element as value
var val = args.pop();
// Store the second element which we will repeat for our first array
var d1 = args.pop();
var xDarr = [];
for (var x = 0; x < d1; x++) {
if (typeof val == 'function') {
xDarr.push(val());
} else {
xDarr.push(val);
};
};
if (args.length >= 1) {
var reversedArg = args.reverse();
return getMatrix(reversedArg, xDarr);
} else {
// if we are only passed 2 arguments, such as (dim (2, true)), return xDarr
return xDarr;
};
};
function getMatrix(arr, item) {
// dimArr equals the first array we have created, example: "[x, x, x]"
var dimArr = item;
for (var i = 0; i < arr.length; i++) {
// iterate through every other element in our args
var finalMatrix = [];
genMatrix(arr[i]);
dimArr = finalMatrix;
// here, the recursion function to return finalMatrix
function genMatrix(num) {
if (num === 1) {
return dimArr;
} else {
return finalMatrix.push(dimArr, genMatrix(num - 1))
};
};
console.log("Updated dimArr: " + dimArr)
};
return dimArr;
};
该函数似乎可以使用长度为四个元素的参数(例如dim( 2,2,2,0 )
),但是对于奇数参数(例如dim( 3,3,"x" )
),我的函数会在结尾处返回number(s)
数组。 dim( 3,3,"x" )
产生以下结果:[ [ 'x', 'x', 'x' ], [ 'x', 'x', 'x' ], [ 'x', 'x', 'x' ], 2 ]
。我尝试使用Mozilla进行研究,但无法弄清楚最后的“ 2”是什么。非常感谢您的帮助!
答案 0 :(得分:0)
该数字通过递归调用插入到函数getMatrix
中:
return finalMatrix.push(dimArr, genMatrix(num - 1))
此处的返回值是push
返回的值,而push
返回finalMatrix
数组的新长度。这意味着,如果 recursive 调用也可以执行此行,则实际上会将数字作为第二个参数传递给push
。并且push
会将您传递给它的所有参数都推入,因此将推入此处的数字。
您可以用不同的方法解决此问题,但是由于genMatrix
的初始调用实际上并未使用返回的值,因此您可以避免返回任何内容,而仅分别执行递归和push
:
function genMatrix(num) {
if (num) {
finalMatrix.push(dimArr);
genMatrix(num - 1);
};
};
请注意,有更简单的方法可以生成矩阵。您可以一起忽略此功能,而在getMatrix
中可以做到:
for (var i = 0; i < arr.length; i++) {
dimArr = Array(arr[i]).fill(dimArr);
}
答案 1 :(得分:0)
该函数应仅传递三个参数-不小于:
function genTable(rows, cells, content) {...
行:行数
单元格:每行的单元格数量(也可以视为列)
内容:要在每个单元格中放置的值
需要两个for
循环才能生成2D数组(即表和矩阵)
声明了一个空数组,该空数组表示表-包含所有子数组的外部数组。
|?表数组?|
[ [...],[...],[...],[...] ]
外部循环会创建一个空数组,该数组代表一行-外部数组(表)中的子数组
[ [ ... ] , [ ... ] , [ ... ] , [ ... ] 。]
行 行 行 行
内部循环将 content [ 3 rd 参数]推入数组。
[[[strong]内容,内容,内容], [内容,内容,内容],[内容,内容, content ],[ content , content , content ]。]
一旦内部循环迭代 N c 次( N c = 个单元< / strong> [ 2 nd 参数]])外循环的下一个循环将整个数组推入表数组,然后创建下一个数组(行)。
此过程重复 N r 次( N r = 行< / strong> [ 1 st 参数])
外部循环完成后,将返回表数组。
function genTable(rows, columns, content) {
const table = [];
for (let r = 0; r < rows; r++) {
let rowArray = [];
for (let c = 0; c < columns; c++) {
rowArray.push(content);
}
table.push(rowArray);
}
return table;
}
console.log(JSON.stringify(genTable(4, 6, 'X')));
console.log(JSON.stringify(genTable(8, 2, 'Y')));
console.log(JSON.stringify(genTable(2, 10, 'Z')));