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

时间:2018-07-30 14:35:40

标签: javascript

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

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

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

更新

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

3 个答案:

答案 0 :(得分:6)

这是您使用的正确方法。但是为了改善比较,您可以将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');
}

答案 1 :(得分:5)

  

我可能还必须检查三个或更多个值。

您可以将元素显示为数组,因此,如果要检查的项目多于两个,则条件将仍然短暂且相同,请使用.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
}

答案 2 :(得分: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
  
);