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

Sec*_*Son 3 javascript arrays validation filter typescript

给定一个包含一些状态字符串的数组,我想验证该数组是否至少包含一个sleeping状态,然后验证其余状态是否为oksleeping

所以一个有效的数组是['ok', 'sleeping', 'sleeping', 'ok'],一个无效的数组将类似于const states = ['ready', 'working','onBreak','sleeping', 'ok', 'sleeping']

到目前为止我想出的是:


const validArray = ['ok', 'sleeping', 'sleeping', 'ok'];

const isvalid = validArray.some( x => x === 'sleeping')

if(isValid){
  const canDoStuff = validArray.some( x => !['ok','sleeping'].includes(x))
  if(canDoStuff){
    doStuff()  
  }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想在一个循环中验证它,而不是两个循环。

Cer*_*nce 5

与其.some检查是否有一项sleeping,不如使用.includes.

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

const validate = input => (
  input.includes('sleeping') &&
  input.every(x => ['ok', 'sleeping'].includes(x))
);

console.log(validate(['ok', 'sleeping', 'sleeping', 'ok']));
console.log(validate(['ready', 'working','onBreak','sleeping', 'ok', 'sleeping']));
Run Code Online (Sandbox Code Playgroud)

  • 主要是为了咯咯笑......但我尝试测试在每次检查之前/之后使用不同的数组内容进行包含检查的性能......有趣的是,不同的浏览器找到一种方法或另一种方法来执行更好的https://www.jsben。 ch/8IwR1 - 我的总体想法是,如果您希望能够尽早退出,请首先测试 every(),然后尝试包含但 YMMV。 (3认同)