代码之家  ›  专栏  ›  技术社区  ›  isar

如何检查JavaScript数组是否只包含两个特定值[重复]

  •  9
  • isar  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我需要检查一个数组是否包含两个值并且只包含它们。

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

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

    更新:

    我可能还要检查三个或更多的值。 有什么好办法吗?顺便说一下,我用 Lodash 在这个项目中。

    3 回复  |  直到 6 年前
        1
  •  5
  •   Peter Mortensen icecrime    6 年前

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

    您可以将元素呈现为一个数组,因此如果要检查的项超过两个,则条件仍然很短且相同,使用 .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
  •  6
  •   Ankit Agarwal    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');
    }
        3
  •  1
  •   KooiInc    6 年前

    另一种非常简单的方法:

    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
      
    );