使用下划线检查数组是否包含两个值中的任何一个
Using underscore to check if array contains either of the two values
使用下划线 _.contains,如何检查两个值中的任何一个?
const valueToCheckFor = undefined || false; // I really thought this would work
const arr1 = [undefined, true, undefined]
_.contains(arr1, valueToCheckFor) => // true
const arr2 = [true, true, true]
_.contains(arr2, valueToCheckFor) => // false
const arr3 = [true, true, false]
_.contains(arr3, valueToCheckFor) => // false ???
期望:
如果在数组中找到 false
或 undefined
,则值应为 true,而我得到 false
for [=14] =]
我不确定 _.contains(arr, value)
是否只能用于检查数组中的一个特定值?
你可能不需要下划线,你可以使用Array.prototype.includes()
const arr1 = [undefined, true, undefined]
arr1.includes(undefined) || arr1.includes(false) // true
或者函数
function IsUndefOrFalse(arr){
return arr.includes(undefined) || arr.includes(false)
}
在您的示例中,valueToCheckFor 将被计算为 false,它不会保留两个值。
您需要做的是为每个值检查一次包含:
const arr1 = [undefined, true, undefined]
console.log(_.contains(arr1, undefined) || _.contains(arr1, false)) // true
const arr2 = [true, true, true]
console.log(_.contains(arr2, undefined) || _.contains(arr2, false)) // false
const arr3 = [true, true, false]
console.log(_.contains(arr3, undefined) || _.contains(arr3, false)) // true
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
此表达式只会将 false
赋值给 valueToCheckFor
:
const valueToCheckFor = undefined || false;
console.log(valueToCheckFor);
此外_.contains()
不能搜索超过一个值。
要搜索多个值,您需要一种可以接受谓词的方法,例如 find
、findIndex
或 some
(下划线或 vanilla js)。
此示例使用 Array#some to iterate the array, since some
returns true
as soon as the predicate function returns true
. The predicate uses Array#includes 检查当前值是否是我们正在寻找的值之一。
const containsMultipleValues = (arr, ...values) => // the values we want to search will be collected to the values array
arr.some(val => values.includes(val)); // check if any item in the arr is included in the values array
const arr1 = [undefined, true, undefined]
console.log(containsMultipleValues(arr1, false, undefined))
const arr2 = [true, true, true]
console.log(containsMultipleValues(arr2, false, undefined))
const arr3 = [true, true, false]
console.log(containsMultipleValues(arr3, false, undefined))
您可以使用交集来检测数组中存在的可用匹配项,如下所示:
var orgArray = [ { tags : ["a1"] },
{ tags : ["a2"] },
{ tags : ["c1"] } ];
var matches = orgArray.filter(function(val) {
return _.intersection(['a1','c1'], val.tags).length > 0;
});
console.log(matches);
console.log(matches.length);
使用下划线 _.contains,如何检查两个值中的任何一个?
const valueToCheckFor = undefined || false; // I really thought this would work
const arr1 = [undefined, true, undefined]
_.contains(arr1, valueToCheckFor) => // true
const arr2 = [true, true, true]
_.contains(arr2, valueToCheckFor) => // false
const arr3 = [true, true, false]
_.contains(arr3, valueToCheckFor) => // false ???
期望:
如果在数组中找到 false
或 undefined
,则值应为 true,而我得到 false
for [=14] =]
我不确定 _.contains(arr, value)
是否只能用于检查数组中的一个特定值?
你可能不需要下划线,你可以使用Array.prototype.includes()
const arr1 = [undefined, true, undefined]
arr1.includes(undefined) || arr1.includes(false) // true
或者函数
function IsUndefOrFalse(arr){
return arr.includes(undefined) || arr.includes(false)
}
在您的示例中,valueToCheckFor 将被计算为 false,它不会保留两个值。
您需要做的是为每个值检查一次包含:
const arr1 = [undefined, true, undefined]
console.log(_.contains(arr1, undefined) || _.contains(arr1, false)) // true
const arr2 = [true, true, true]
console.log(_.contains(arr2, undefined) || _.contains(arr2, false)) // false
const arr3 = [true, true, false]
console.log(_.contains(arr3, undefined) || _.contains(arr3, false)) // true
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
此表达式只会将 false
赋值给 valueToCheckFor
:
const valueToCheckFor = undefined || false;
console.log(valueToCheckFor);
此外_.contains()
不能搜索超过一个值。
要搜索多个值,您需要一种可以接受谓词的方法,例如 find
、findIndex
或 some
(下划线或 vanilla js)。
此示例使用 Array#some to iterate the array, since some
returns true
as soon as the predicate function returns true
. The predicate uses Array#includes 检查当前值是否是我们正在寻找的值之一。
const containsMultipleValues = (arr, ...values) => // the values we want to search will be collected to the values array
arr.some(val => values.includes(val)); // check if any item in the arr is included in the values array
const arr1 = [undefined, true, undefined]
console.log(containsMultipleValues(arr1, false, undefined))
const arr2 = [true, true, true]
console.log(containsMultipleValues(arr2, false, undefined))
const arr3 = [true, true, false]
console.log(containsMultipleValues(arr3, false, undefined))
您可以使用交集来检测数组中存在的可用匹配项,如下所示:
var orgArray = [ { tags : ["a1"] },
{ tags : ["a2"] },
{ tags : ["c1"] } ];
var matches = orgArray.filter(function(val) {
return _.intersection(['a1','c1'], val.tags).length > 0;
});
console.log(matches);
console.log(matches.length);