Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,如何确保数组至少有一个特定元素,而其他元素满足另一个条件?_Javascript_Arrays_Typescript_Validation_Filter - Fatal编程技术网

在JavaScript中,如何确保数组至少有一个特定元素,而其他元素满足另一个条件?

在JavaScript中,如何确保数组至少有一个特定元素,而其他元素满足另一个条件?,javascript,arrays,typescript,validation,filter,Javascript,Arrays,Typescript,Validation,Filter,给定一个包含某些状态字符串的数组, 我想验证数组是否至少包含一个睡眠状态,然后验证其余状态是否为正常或睡眠 因此,一个有效的数组是['ok','sleeping','sleeping','ok']而一个无效的数组是类似常量状态=['ready','working','onBreak','sleeping','ok','sleeping'] 到目前为止,我得出的结论是: const validArray=['ok','sleeping','sleeping','ok']; const isval

给定一个包含某些状态字符串的数组, 我想验证数组是否至少包含一个
睡眠
状态,然后验证其余状态是否为
正常
睡眠

因此,一个有效的数组是
['ok','sleeping','sleeping','ok']
而一个无效的数组是类似
常量状态=['ready','working','onBreak','sleeping','ok','sleeping']

到目前为止,我得出的结论是:


const validArray=['ok','sleeping','sleeping','ok'];
const isvalid=validArray.some(x=>x=='sleeping')
如果(有效){
const canDoStuff=validArray.some(x=>![“ok”,“sleeping”]。包括(x))
if(canDoStuff){
多斯塔夫()
}
}

理想情况下,我希望在单个循环中验证,而不是在两个循环中验证。

而不是
。有些
要检查是否有一个
休眠
项,请使用
。包括

但是,您的另一个
。一些
也没有实现正确的逻辑
doStuff
仅当至少有一项不匹配时才会运行。改为使用
。每个
,并检查每个是否匹配:

const validate=input=>(
input.includes('sleeping')&&
每(x=>['ok','sleeping'].包括(x))
);
日志(验证(['ok','sleeping','sleeping','ok']);

日志(验证(['ready','working','onBreak','sleeping','ok','sleeping'])您可以使用一个简单的for循环,如下所示:

const validate=arr=>{
让我们相信这是错误的;
对于(让str的arr){
如果(![“睡眠”,“确定”].包括(str))返回false;
如果(str==“sleeping”)foundSleeping=true;
}
返回睡眠;
};
日志(验证(['ok','sleeping','sleeping','ok']);

日志(验证(['ready','working','onBreak','sleeping','ok','sleeping'])如果您想要最快的代码,请使用简单的
for
循环:

“严格使用”;
函数isValid(数组){
让睡眠=虚假;
for(数组的常量项){
如果(项目=='sleeping'){
睡眠=真实;
}否则,如果(项目!=“确定”){
返回false;
}
}
恢复睡眠;
}
功能测试(阵列){
log(isValid(数组)?“Valid:”:“Invalid:”,数组);
}
测试([‘正常’、‘睡眠’、‘睡眠’、‘正常’);

测试(['ready'、'working'、'onBreak'、'sleeping'、'ok'、'sleeping'])在一个循环中执行它是很奇怪的。因为“如果睡眠存在”的测试一旦找到一个就可以终止,而“正常或睡眠以外的东西”的测试可能需要一路评估到最终结果end@Taplar我看不出使用单个循环有什么奇怪的地方。在最坏的情况下(所有条目都是“ok”或“sleeping”),您必须扫描整个阵列。只有在遇到这两个值之外的值时,才可以提前爆发。无论使用一个循环还是多个循环,情况都是如此。有关单循环解决方案的示例,请参见。主要是关于咯咯笑。。。但是我尝试在每次检查之前/之后使用不同的数组内容测试include检查的性能。。。有趣的是,不同的浏览器会找到一种或另一种方法来提高性能—我的一般想法是,如果您想尽早退出,请先测试every(),然后尝试includes but YMMV。@scunlife感谢您创建了这个有趣的测试套件。不过,每种情况的性能都由
控制台.log
调用控制。我添加了一个新版本的测试,删除了这些调用,并从我的答案中添加了for循环代码。无论是否使用
console.log
,我都注意到在同一个浏览器中不同的运行方式有很大的差异。有时“包含第一个”的速度更快,而有时“每个第一个”。在所有情况下,for循环都比这两种循环都快。我认为简单for循环有价值,能够完全控制其中的测试,但是我认为OP考虑的是,如果所有条目都正常或处于休眠状态,那么数组是有效的。。。至少有一个值是“sleep”。@scunlife我很确定这正是这段代码的作用。如果任何项不是“睡眠”和“确定”,则返回false。如果所有项都是“正在睡眠”或“确定”,则如果至少有一项是“正在睡眠”,则返回true,否则返回false。你能指出逻辑中的错误吗,或者你有一个失败的测试用例吗?你是对的,我把“!==”误读为“==”,你的代码很好。