猿问

检查数组是否包含2个不同值的最快方法?

考虑以下数组:


['a', 'b', 'a'] //method should return true

['a', 'b', 'c'] //method should return true

['a', 'c', 'c'] //method should return false

我想编写一种最有效地检查数组中是否同时存在“ a”和“ b”的方法。我知道我可以在一个简单的for循环中做到这一点


let a_counter = 0;

let b_counter = 0;

for (let i = 0; i < array.length; i++) {

    if (array[i] === 'a') {

        a_counter++;

    }

    if (array[i] === 'b') {

        b_counter++;

    }

}

return (a_counter > 0 && b_counter > 0);

但这不是很短。我可以,indexOf但是会循环两次。我还考虑过使用如下设置:


const letter_set = new Set(array)

return (letter_set.has('a') && letter_set.has('b')) 

但是我对集合非常陌生,不知道这种解决方案是否可能比循环更昂贵。我知道has()操作应该比数组迭代更快,但是构造集合可能至少需要O(N)时间(我假设)。


有没有一种干净有效的方法来查找数组中的多个元素?ES6解答欢迎


慕尼黑的夜晚无繁华
浏览 283回答 3
3回答

米脂

您可以使用every和include来执行此检查。所以我们说每个项目都必须包含在数组中。function contains(arr, ...items) {&nbsp; return items.every(i => arr.includes(i))}console.log(contains(['a', 'b', 'a'], 'a', 'b'))console.log(contains(['a', 'c', 'c'], 'a', 'b'))console.log(contains(['a', 'b', 'c'], 'a', 'b', 'c'))console.log(contains(['a', 'b', 'c', 'd'], 'a', 'b', 'c', 'd', 'e'))

DIEA

您可以仅使用,Set并检查所需项目是否在items数组中。const&nbsp; &nbsp; check = (items, wanted) => wanted.every(Set.prototype.has, new Set(items));console.log(check(['a', 'b', 'a'], ['a', 'b'])); //&nbsp; trueconsole.log(check(['a', 'b', 'c'], ['a', 'b'])); //&nbsp; trueconsole.log(check(['a', 'c', 'c'], ['a', 'b'])); // false

慕少森

虽然没有其他示例那么紧凑,但是它确实可以单次运行。const arr1 = ['a', 'b', 'a']; //method should return trueconst arr2 = ['a', 'c', 'c']; //method should return falseconst arr3 = ['a', 'b', 'c']; //method should return trueconst reducer = ({ a, b }, char) => ({&nbsp; a: a || char === 'a',&nbsp; b: b || char === 'b'});const includesAnB = arr => {&nbsp; const { a, b } = arr.reduce(reducer, {});&nbsp; return a && b;}console.log(includesAnB(arr1));console.log(includesAnB(arr2));console.log(includesAnB(arr3));
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答