我正在处理编码问题并编写一个函数,该函数将以类似蜗牛的模式遍历嵌套数组(例如here)。
例如,给定[[1,2,3], [8,9,4], [7,6,5]]
的输入,该函数应输出[1,2,3,4,5,6,7,8,9]
。
在我的main函数中,我创建了4个函数来遍历所有方向的数组。在每一步,我将值推到当前网格位置,并检查一个标志数组,以确定是否已访问过下一个位置。
我有两个问题:
array.slice(0)
,新的flagsArray
似乎也可以作为指向array
的指针,当我修改flagsArray
时,更改会反映在array
中。那是为什么?当我运行此测试时,我的克隆方法似乎有效:
var array = [0, 1];
var array_clone = array.slice(0);
array_clone[2] = 3;
console.log(array); // No changes to array
flagsArray[(i + 1)] is undefined
错误。这看起来像是尝试读取flagsArray
之外的索引。但是,如果我在flagsArray[i + 1][j] === false && i < flagsArray.length
循环中检查while
,那么一旦尝试超出数组读取,循环就不应该停止吗?一个因为flagsArray[flags.Array.length]
未定义,因此不等于false
,另一个原因是我也检查i
是否在flagsArray
范围内。这是我的功能:
snail = function(array) {
console.log(array);
var output = [];
var flagsArray = array.slice(0);
// Populating flagsArray with false values
// False = index not visited yet
for (var i = 0; i < flagsArray.length; i++) {
for (var j = 0; j < flagsArray[i].length; j++) {
flagsArray[i][j] = false;
}
}
var i = 0;
var j = 0;
var traverseRight = function() {
while (flagsArray[i][j + 1] === false && j < flagsArray[i].length) {
console.log(flagsArray[i][j].length + 'Traversing right Index traversed: [' + i + '][' + j +'] Flag before: ' + flagsArray[i][j] + 'Element pushed: ' + array[i][j]);
output.push(array[i][j]);
flagsArray[i][j] = true;
j++;
}
}
var traverseDown = function() {
while (flagsArray[i + 1][j] === false && i < flagsArray.length) {
console.log('Traversing Down Index traversed: [' + i + '][' + j +'] Flag before: ' + flagsArray[i][j] + 'Element pushed: ' + array[i][j]);
output.push(array[i][j]);
flagsArray[i][j] = true;
i++;
}
}
var traverseLeft = function() {
while (array[i][j - 1] === false && j >= 0) {
console.log('Traversing left Index traversed: [' + i + '][' + j +'] Flag before: ' + flagsArray[i][j] + 'Element pushed: ' + array[i][j]);
output.push(array[i][j]);
flagsArray[i][j] = true;
j--;
}
}
var traverseUp = function() {
while (array[i][j] === false && j >= 0) {
console.log('Traversing Up Index traversed: [' + i + '][' + j +'] Flag before: ' + flagsArray[i][j] + 'Element pushed: ' + array[i][j]);
output.push(array[i][j]);
flagsArray[i][j] = true;
i--;
}
}
while (flagsArray[i][j + 1] === false) {
traverseRight();
traverseDown();
traverseLeft();
traverseUp();
}
return output;
}
console.log(snail([[1,2,3],[8,9,4],[7,6,5]]));
答案 0 :(得分:-1)
尝试一下:
function spiral(array) {
const matrix = [...array];
const arr = [];
while (matrix.length) {
arr.push(
...matrix.shift(),
...matrix.map(a => a.pop()),
...matrix.pop().reverse(),
...matrix.map(a => a.shift()).reverse()
);
}
return arr;
}