Мне нужно проверить, включает ли массив два значения и только их.
На данный момент это мое уродливое решение:
if (myArray.includes('foo') && myArray.includes('bar') && myArray.length === 2) {
// Do something
}
Обновлять:
Возможно, мне также придется проверить три или более значений. Какое-нибудь элегантное решение? Кстати, в этом проекте я использую Лодаш.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это правильный путь, который вы использовали. Но для улучшения сравнения вы можете поставить 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 ничего
Возвращает истину для ['foo', 'foo'] и ['foo', 'bar'] (но OP не ясно об этом).
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
Спасибо ... Я работал, но это не сработало, как ожидалось, пока я не сделал это: (myArray.length === myItems.length && _.difference(myArray, myItems).length === 0).
Да, и если вы хотите использовать только lodash, проверьте мое обновление с помощью _.size
Зачем использовать функцию lodash, если ванильный JS - лучший и понятный вариант? Есть ли какие-то преимущества?
Почему вы думаете, что это тем лучше и яснее?
Другой и довольно простой подход:
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
);
Что означает "&&" в конце?