Как проверить, содержит ли массив JavaScript только два определенных значения

Мне нужно проверить, включает ли массив два значения и только их.

На данный момент это мое уродливое решение:

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

Обновлять:

Возможно, мне также придется проверить три или более значений. Какое-нибудь элегантное решение? Кстати, в этом проекте я использую Лодаш.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
0
5 625
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это правильный путь, который вы использовали. Но для улучшения сравнения вы можете поставить 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.info('All items matched');
} else {
  console.info('All items do not matched');
}

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

Что означает "&&" в конце?

ramden 30.07.2018 16:52

@ramden ничего

Ankit Agarwal 30.07.2018 16:52

Возвращает истину для ['foo', 'foo'] и ['foo', 'bar'] (но OP не ясно об этом).

Salman A 30.07.2018 22:04
Ответ принят как подходящий

I may have to check three or more values as well.

Вы можете представить свои элементы в виде массива, поэтому, если вам нужно проверить более двух элементов, условие будет по-прежнему коротким и таким же, используя метод .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.info('PASS');
}

Обновлено:

Поскольку вы используете lodash, вы можете просто использовать _.difference(), например:

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

Проверьте мое предложение lodash @isar

Zakaria Acharki 30.07.2018 17:15

Спасибо ... Я работал, но это не сработало, как ожидалось, пока я не сделал это: (myArray.length === myItems.length && _.difference(myArray, myItems).length === 0).

isar 30.07.2018 17:36

Да, и если вы хотите использовать только lodash, проверьте мое обновление с помощью _.size

Zakaria Acharki 30.07.2018 17:38

Зачем использовать функцию lodash, если ванильный JS - лучший и понятный вариант? Есть ли какие-то преимущества?

vol7ron 30.07.2018 19:28

Почему вы думаете, что это тем лучше и яснее?

Zakaria Acharki 30.07.2018 19:30

Другой и довольно простой подход:

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.info(
  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.info(
  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
  
);

Другие вопросы по теме