如何检查一个JavaScript数组是否仅包含两个特定值

15

我需要检查一个数组是否仅包含两个特定的值。

目前这是我的丑陋解决方案:

if (myArray.includes('foo') && myArray.includes('bar') && myArray.length === 2) {
    // Do something
}

更新:

我可能还需要检查三个或更多的值。 有没有更优雅的解决方案?顺便说一下,我在这个项目中使用了Lodash

3个回答

12

我可能需要检查三个或更多的值。

你可以将元素表示为数组,所以如果你有超过两个要检查的项目,条件仍然会很短,并且使用.every()方法相同,例如:

myArray.every(elem => [1,2].indexOf(elem) > -1)

var myArray = [2, 1];
var myItems = [1, 2];

if (myArray.length === myItems.length && myArray.every(elem => myItems.indexOf(elem) > -1)) {
  console.log('PASS');
}

更新:

由于您正在使用lodash,因此您可以直接使用_.difference(),例如:

if (_.size(myArray) === _.size(myItems) && _.difference(myArray, myItems).length === 0) {
    // Do something
}

请检查我的lodash建议 @isar - Zakaria Acharki
谢谢...我试过了,但是直到我加入这个条件(myArray.length === myItems.length && _.difference(myArray, myItems).length === 0)才达到预期效果。 - isar
是的,如果您想仅使用lodash,请检查我的更新,使用_.size - Zakaria Acharki
为什么要使用lodash函数,而不是更好、更清晰的原生JS选项?它有什么优势吗? - vol7ron
你为什么认为这是更好和更清晰的呢? - Zakaria Acharki

10

您使用的是正确的方法。但为了提高比较效率,您可以将 myArray.length === 2 放在开头,如果长度不是 2,它会立即失败:

if (myArray.length === 2 && myArray.includes('foo') && myArray.includes('bar')) {
  // do something
}

如果您想比较更多的值,那么可以借助自定义函数来实现:

function checkIncluded(myArray, checkingArray){
  if(myArray.length !== checkingArray.length){
    return false;
  }
  var match = true;
  for(var i=0; i<checkingArray.length; i++){
    if(!myArray.includes(checkingArray[i])){
      match = false;
      break;
    }
  }
  return match;
}


var neededItems = ['foo', 'bar', 'pat', 'jack'];
var myArray = ['jack', 'bar', 'foo', 'pat']
var included = checkIncluded(myArray, neededItems);
if (included) {
  console.log('All items matched');
} else {
  console.log('All items do not matched');
}

neededItems = ['bar', 'pat', 'jack'];
myArray = ['jack', 'bar', 'foo', 'pat']
included = checkIncluded(myArray, neededItems);
if (included) {
  console.log('All items matched');
} else {
  console.log('All items do not matched');
}


“&&” 在结尾处是什么作用? - ramden
@ramden 什么也没有 - Ankit Agarwal
对于 ['foo', 'foo']['foo', 'bar'] 返回 true(但是 OP 没有明确说明)。 - Salman A

1
一种不同且相当简单的方法:

const checkExact = (arr, v1, v2) => `${v1}${v2}` === String(arr.join(""));
const arr1 = [1, 2, 3];
const arr2 = [15, 23];
const arr3 = ["foo", "bar"];
const arr4 = ["foo", "bar", "foobar"];

console.log(
  checkExact(arr1, 1, 2),         // false
  checkExact(arr2, 15, 23),       // true
  checkExact(arr3, "foo", "bar"), // true
  checkExact(arr4, "foo", "bar")  // false
);

// more generic
const checkExactX = (arr, ...values) => 
  values.reduce( (p, n) => `${p}${n}`, "" ) === String(arr.join(""));
const arr5 = ["foo", "bar", "foobar", "barfoo"];
console.log(
  checkExactX(arr1, 1, 2),                   // false
  checkExactX(arr2, 15, 23),                 // true
  checkExactX(arr3, "foo", "bar"),           // true
  checkExactX(arr4, "foo", "bar", "foobar"), // true
  checkExactX(arr4, "foobarfoobar"),         // true
  checkExactX(arr5, "foo", "bar", "foobar")  // false
  
);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接