Javascript 代码检查,帮助改进此代码以避免重复
我正在研究数独游戏,下面的代码可以工作,但是很容易看到有很多重复的代码。我如何优化它?谢谢 问题:getSection:此函数应接受三个参数:数独网格和拼图的3x3子网格之一的x和y坐标。函数应返回一个数组,其中包含指定子网格中的所有数字 输入示例:Javascript 代码检查,帮助改进此代码以避免重复,javascript,function,optimization,sudoku,Javascript,Function,Optimization,Sudoku,我正在研究数独游戏,下面的代码可以工作,但是很容易看到有很多重复的代码。我如何优化它?谢谢 问题:getSection:此函数应接受三个参数:数独网格和拼图的3x3子网格之一的x和y坐标。函数应返回一个数组,其中包含指定子网格中的所有数字 输入示例: var puzzle = [[ 8,9,5, 7,4,2, 1,3,6 ], [ 2,7,1, 9,6,3, 4,8,5 ], [ 4,6,3, 5,8,1, 7,9,2
var puzzle = [[ 8,9,5, 7,4,2, 1,3,6 ],
[ 2,7,1, 9,6,3, 4,8,5 ],
[ 4,6,3, 5,8,1, 7,9,2 ],
[ 9,3,4, 6,1,7, 2,5,8 ],
[ 5,1,7, 2,3,8, 9,6,4 ],
[ 6,8,2, 4,5,9, 3,7,1 ],
[ 1,5,9, 8,7,4, 6,2,3 ],
[ 7,4,6, 3,2,5, 8,1,9 ],
[ 3,2,8, 1,9,6, 5,4,7 ]];
输出:
getSection(puzzle, 0, 0);
// -> [ 8,9,5,2,7,1,4,6,3 ]
解决方案:
function getSection(arr, x, y) {
var section = [];
if (y === 0) {
arr = arr.slice(0, 3);
if (x === 0) {
arr.forEach(function (element) {
section.push(element.slice(0, 3));
})
} else if (x === 1) {
arr.forEach(function (element) {
section.push(element.slice(3, 6));
})
} else {
arr.forEach(function (element) {
section.push(element.slice(6, 9));
})
}
}
if (y === 1) {
arr = arr.slice(4, 7);
if (x === 0) {
arr.forEach(function (element) {
section.push(element.slice(0, 3));
})
} else if (x === 1) {
arr.forEach(function (element) {
section.push(element.slice(3, 6));
})
} else {
arr.forEach(function (element) {
section.push(element.slice(6, 9));
})
}
}
if (y === 2) {
arr = arr.slice(6, 9);
if (x === 0) {
arr.forEach(function (element) {
section.push(element.slice(0, 3));
})
} else if (x === 1) {
arr.forEach(function (element) {
section.push(element.slice(3, 6));
})
} else {
arr.forEach(function (element) {
section.push(elemet.slice(6, 9));
})
}
}
var subgrid = section.reduce(function (a, b) {
return a.concat(b);
},
[]
);
return subgrid;
}
console.log(getSection(puzzle, 0, 0));
// // -> [ 8,9,5,2,7,1,4,6,3 ]
console.log(getSection(puzzle, 1, 0));
// -> [ 7,4,2,9,6,3,5,8,1 ]
不像@nutboltu那样优雅,但几乎一样简洁
function getSection(arr, x, y) {
var section = [];
z = (y===0?0:y+y+2);
arr = arr.slice(z, z+3);
arr.forEach(function (element) {
section.push(element.slice(z, z+3));
})
var subgrid = section.reduce(function (a, b) {
return a.concat(b);
},
[]
);
return subgrid;
}
我假设x和y不会超过数组长度。下面是实现解决方案的最简单方法
function getSection(arr, x, y) {
var GRID_SIZE = 3;
var indexX = x*GRID_SIZE;
var indexY = y*GRID_SIZE;
var results = [];
for(var i = indexY; i< indexY+GRID_SIZE; i++){
results = results.concat(puzzle[i].slice(indexX, indexX+GRID_SIZE));
}
return results;
}
console.log(getSection(puzzle, 0, 0));
// // -> [ 8,9,5,2,7,1,4,6,3 ]
console.log(getSection(puzzle, 1, 0));
// -> [ 7,4,2,9,6,3,5,8,1 ]
以下是我对ES6的看法 常数谜题=[ [8, 9, 5, 7, 4, 2, 1, 3, 6], [2, 7, 1, 9, 6, 3, 4, 8, 5], [4, 6, 3, 5, 8, 1, 7, 9, 2], [9, 3, 4, 6, 1, 7, 2, 5, 8], [5, 1, 7, 2, 3, 8, 9, 6, 4], [6, 8, 2, 4, 5, 9, 3, 7, 1], [1, 5, 9, 8, 7, 4, 6, 2, 3], [7, 4, 6, 3, 2, 5, 8, 1, 9], [3, 2, 8, 1, 9, 6, 5, 4, 7] ]; 常数网格大小=3; 函数getOffsetcoordinate{ 常量开始=坐标*网格大小; const end=开始+网格大小; 返回[开始,结束]; } 函数getSectionarr,x,y{ const yOffset=getOffsety; const xOffset=getOffsetx; 常量元素=arr.slice…yOffset; 返回元素 .mapelement=>element.slice…xOffset .reducesubgrid,grid=>[…子网格,…网格]; } console.loggetSectionpuzzle,0,0; // // -> [ 8,9,5,2,7,1,4,6,3 ] console.loggetSectionpuzzle,1,0;
//->[7,4,2,9,6,3,5,8,1]在那里提问可能会更好:虽然你可能会被否决而被遗忘,但我很喜欢这个-我希望这些答案对你有用谢谢大家的回答,这真的很有帮助,非常感谢。我知道这个问题对你们所有人来说都太基本了,但我并不觉得不好,因为我对这个问题还不熟悉,我想改进我的练习。