我需要检查数组是否仅包含两个值。
这是我目前的丑陋解决方案:
if (myArray.includes('foo') && myArray.includes('bar') && myArray.length === 2) {
// Do something
}
更新:
我可能还必须检查三个或更多值。 有什么优雅的解决方案吗?顺便说一下,我在这个项目中使用Lodash。
答案 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
);