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;
}