如何解决在JavaScript中,如何确保数组具有至少一个特定元素,而其他元素满足另一条件?
给出一个包含一些状态字符串的数组,
我想验证数组是否包含至少一个sleeping
状态,然后验证其余状态是ok
还是sleeping
。
因此有效数组为['ok','sleeping','ok']
,无效数组将类似于const states = ['ready','working','onBreak','ok','sleeping']
到目前为止,我想出的是:
const validArray = ['ok','ok'];
const isvalid = validArray.some( x => x === 'sleeping')
if(isValid){
const canDoStuff = validArray.some( x => !['ok','sleeping'].includes(x))
if(canDoStuff){
doStuff()
}
}
理想情况下,我想在一个循环而不是两个循环中进行验证。
解决方法
使用.some
来代替sleeping
来检查是否有一个.includes
。
但是,您的其他.some
也没有实现正确的逻辑; doStuff
仅在至少有一个不匹配匹配的项目时运行。请改用.every
,并检查每个都匹配:
const validate = input => (
input.includes('sleeping') &&
input.every(x => ['ok','sleeping'].includes(x))
);
console.log(validate(['ok','sleeping','ok']));
console.log(validate(['ready','working','onBreak','ok','sleeping']));
,
如果您想要最快的代码,请使用简单的for
循环:
'use strict';
function isValid( array ) {
let sleeping = false;
for( const item of array ) {
if( item === 'sleeping' ) {
sleeping = true;
} else if( item !== 'ok' ) {
return false;
}
}
return sleeping;
}
function test( array ) {
console.log( isValid(array) ? 'Valid:' : 'Invalid:',array );
}
test( [ 'ok','ok' ] );
test( [ 'ready','sleeping' ] );
这比其他答案建议的代码要多一些,但是比任何其他答案都要快。
特别是,接受的答案使用两个循环,而不是一个。您看不到循环,因为它们隐藏在.includes()
和.every()
调用中。
我并不是说这是对该代码的批评-它非常干净和简单,我一直喜欢。但是,当性能很重要时,编写老式代码有助于将多个循环组合为一个循环。
当然,在性能可能很重要时进行基准测试总是明智的,所以我参加了@scunliffe创建的测试(谢谢!),并添加了使用此循环的测试:https://jsben.ch/vrzl1
如果您需要支持旧版本的Internet Explorer,请使用数字for
循环代替for-of
循环,并使用var
代替let
和{{1 }}。
您可以使用以下简单的for循环:
const validate = arr => {
let foundSleeping = false;
for (let str of arr) {
if (!["sleeping","ok"].includes(str)) return false;
if (str === "sleeping") foundSleeping = true;
}
return foundSleeping;
};
console.log(validate(['ok','sleeping']));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。