Javascript 如何使include方法检查多个参数?
现在,我正在尝试开发一个数独项目背后的逻辑。我的函数Javascript 如何使include方法检查多个参数?,javascript,arrays,Javascript,Arrays,现在,我正在尝试开发一个数独项目背后的逻辑。我的函数include1to9接受拼图的任何行或列,如果该行包含从1到9的每个数字,并且这些数字本身不重复,则应返回true。我想,只要定义它必须包含的内容,就可以了。如何使include方法检查多个参数?正如我现在看到的,它总是返回true,即使该部分有重复的数字,并且不包括从1到9的所有数字。我将留下我制作的数独网格和函数。我有两次尝试,一次被注释掉了。它们都不起作用 let puzzle = [[ 8,9,5, 7,4,2, 1,3,6
include1to9
接受拼图的任何行或列,如果该行包含从1到9的每个数字,并且这些数字本身不重复,则应返回true
。我想,只要定义它必须包含的内容,就可以了。如何使include方法检查多个参数?正如我现在看到的,它总是返回true,即使该部分有重复的数字,并且不包括从1到9的所有数字。我将留下我制作的数独网格和函数。我有两次尝试,一次被注释掉了。它们都不起作用
let 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 ]];
function includes1to9 (subSection) {
for (let i = 1; i < 10; i++) {
if (subSection.includes(i)) {
return true;
} else {
return false;
}
}
// if (subSection.includes(1 && 2 && 3 && 4 && 5 && 6 && 7 && 8 && 9)) {
// return true;
// } else {
// return false;
// }
}
let 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 ]];
功能包括1至9(小节){
for(设i=1;i<10;i++){
如果(第(i)小节){
返回true;
}否则{
返回false;
}
}
//if(包括(1&&2&&3&&4&&5&&6&&7&&8&&9)小节){
//返回true;
//}其他{
//返回false;
// }
}
在数组上循环并创建一个表示每个元素是否存在的对象。这样的对象更容易验证
功能包括1到9(小节){
如果(subSection.length!==9)返回false;
const vis=subSection.reduce((vis,cur)=>(vis[cur]=true,vis),{});
常量键=对象键(vis);
允许常数=[1,2,3,4,5,6,7,8,9];
return keys.length==9&&keys.every(key=>allowed.includes(+key));
}
控制台日志(包括1到9([1,9,8,7,6,5,4,3,2])代码>在数组上循环并创建一个表示每个元素是否存在的对象。这样的对象更容易验证
功能包括1到9(小节){
如果(subSection.length!==9)返回false;
const vis=subSection.reduce((vis,cur)=>(vis[cur]=true,vis),{});
常量键=对象键(vis);
允许常数=[1,2,3,4,5,6,7,8,9];
return keys.length==9&&keys.every(key=>allowed.includes(+key));
}
控制台日志(包括1到9([1,9,8,7,6,5,4,3,2])代码>当前逻辑的工作方式就像一个或门。如果包含任何数字,则返回true。我可以在您注释掉的尝试中看到,您试图将此设置为AND门,但不幸的是,您不能像包含函数那样将参数串在一起。你必须写你自己的和门。您可以通过将初始变量设置为true,然后仅在任何数字未出现时将其设置为false来实现:
功能包括1到9(小节){
让andGate=true;
for(设i=1;i<10;i++){
如果(!包括第(i)小节){
andGate=false;
}
}
返回门;
}
这假设子部分有9个元素长,在这种情况下,如果每个数字出现一次,则必须没有重复项,因此无需检查重复项。当前逻辑的工作方式就像一个或门。如果包含任何数字,则返回true。我可以在您注释掉的尝试中看到,您试图将此设置为AND门,但不幸的是,您不能像包含函数那样将参数串在一起。你必须写你自己的和门。您可以通过将初始变量设置为true,然后仅在任何数字未出现时将其设置为false来实现:
功能包括1到9(小节){
让andGate=true;
for(设i=1;i<10;i++){
如果(!包括第(i)小节){
andGate=false;
}
}
返回门;
}
这假设子节有9个元素长,在这种情况下,如果每个数字出现一次,则必须没有重复项,因此无需检查重复项。更新:
这里有一个更惯用的解决方案:
函数包括(arr,…args){
return!args.some(arg=>!arr.includes(arg));
}
用法示例:
console.log(包括(您的_数组,1,2,3,4,5,6,7,8,9));
由于Array.some
一旦发现任何元素与指定条件匹配,就会返回true
,我们可以将条件设置为一个元素是否未包含在数组中,在这种情况下,检查将在第一个未包含的元素(如果有)上短路并在不浪费时间检查更多元素的情况下尽早失败
当然,我们返回的是与相反的内容。一些返回的内容是用翻转它代码>运算符,因为我们更希望直接知道是否包含所有元素,而不是是否包含任何元素
下面是一个惯用的解决方案:
函数包括(arr,…args){
返回args.map(arg=>arr.includes(arg))
.filter(布尔值).length==args.length;
}
下面是一个或两个如何使用它的示例:
函数包括(arr,…args){
返回args.map(arg=>arr.includes(arg))
.filter(布尔值).length==args.length;
}
常量数组=[1,2,3,4,5,6,7,8,9];
console.log(
包括(数组,1,2,3,4,5,6,7,8,9),//true
includes(数组,1,2,3,4,5,6,7,8,9,10)//false
);代码>更新:
这里有一个更惯用的解决方案:
函数包括(arr,…args){
return!args.some(arg=>!arr.includes(arg));
}
用法示例:
console.log(包括(您的_数组,1,2,3,4,5,6,7,8,9));
因为数组。一些返回function includes1to9 (subSection) {
let andGate = true;
for (let i = 1; i < 10; i++) {
if (!subSection.includes(i)) {
andGate = false;
}
}
return andGate;
}