我需要检查一个数组是否仅包含两个特定的值。
目前这是我的丑陋解决方案:
if (myArray.includes('foo') && myArray.includes('bar') && myArray.length === 2) {
// Do something
}
更新:
我可能还需要检查三个或更多的值。 有没有更优雅的解决方案?顺便说一下,我在这个项目中使用了Lodash。
我需要检查一个数组是否仅包含两个特定的值。
目前这是我的丑陋解决方案:
if (myArray.includes('foo') && myArray.includes('bar') && myArray.length === 2) {
// Do something
}
更新:
我可能还需要检查三个或更多的值。 有没有更优雅的解决方案?顺便说一下,我在这个项目中使用了Lodash。
我可能需要检查三个或更多的值。
你可以将元素表示为数组,所以如果你有超过两个要检查的项目,条件仍然会很短,并且使用.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
}
您使用的是正确的方法。但为了提高比较效率,您可以将 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');
}
['foo', 'foo']
和 ['foo', 'bar']
返回 true(但是 OP 没有明确说明)。 - Salman Aconst 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
);
(myArray.length === myItems.length && _.difference(myArray, myItems).length === 0)
才达到预期效果。 - isar_.size
。 - Zakaria Acharki