我有一个可以包含许多值的数组。我需要的是一种检查此数组中的所有值是否都与我的期望值匹配的方法。
这是我到目前为止所做的:
const arr = ['foo', 'foo', 'bar', 'foo', 'baz', 'foo', 'qux'];
// I need to see if all values in arr is eqaul to 'foo'
const mappedArr = arr.map(item => item === 'foo');
if (!mappedArr.includes(false)) {
console.log('my condition is satisfied');
} else {
console.log('Nope! something else is in there');
}
但是这需要循环所有元素,并将该数组转换为“ true / false”数组,并检查新数组是否包含值。
在列表很大的情况下,这似乎不是一个好方法。如果我遇到第一个不匹配的元素后就能够中断此循环,那就更好了。
有更好的方法吗?
答案 0 :(得分:3)
为什么有.every()
时有人会写出如此复杂的逻辑?
const arr1 = ['foo', 'foo', 'bar', 'foo', 'baz', 'foo', 'qux'];
const arr2 = ['foo', 'foo', 'foo', 'foo'];
const checker = (arr, str) => arr.every(s => s === str);
console.log(checker(arr1, 'foo'));
console.log(checker(arr2, 'foo'));
答案 1 :(得分:1)
使用过滤器代替地图
const arr = ['foo', 'foo', 'bar', 'foo', 'baz', 'foo', 'qux'];
arr.filter(e=>e=='foo').length==arr.length?console.log(true):console.log(false)
答案 2 :(得分:1)
您正在寻找Array.prototype.some
arr.some(element => element !== 'foo') !== false
如果其中一个元素不等于'foo'
,它将返回true,
如果它们都等于'foo'
,则返回false。
答案 3 :(得分:1)
let arr = ['foo', 'foo', 'bar', 'foo', 'baz', 'foo', 'qux'];
console.log(arr.every(elm => elm === 'foo')); //false
arr = arr.map(elm => 'foo'); //changing every element to 'foo' for testing
console.log(arr.every(elm => elm === 'foo')); //true
答案 4 :(得分:0)
这就是地图的作用。映射函数返回返回值的数组。使用每个-The every() method tests whether all elements in the array pass the test implemented by the provided function
。您将返回布尔值item ==='foo',因此将得到布尔数组。