Есть ли в JavaScript эквивалент Array.some() и Array.every() для встроенного объекта Set?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Нет, единственные встроенные методы на Set.prototypeявляются:
Set.prototype.add()
Set.prototype.clear()
Set.prototype.delete()
Set.prototype.entries()
Set.prototype.forEach()
Set.prototype.has()
Set.prototype.values()
Set.prototype[@@iterator]()
Вероятно, было бы проще просто преобразовать набор в массив, а затем использовать методы массива.
const set1 = new Set([1, 2]);
const set2 = new Set([-1, 2]);
const allPositive = set => [...set].every(num => num > 0);
console.info(
allPositive(set1),
allPositive(set2)
);https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#Methods — это документация по списку доступных методов для Set
Methods:
Set.prototype.add()
Set.prototype.clear()
Set.prototype.delete()
Set.prototype.entries()
Set.prototype.forEach()
Set.prototype.has()
Set.prototype.values()
Set.prototype@@iterator
В вашем контексте вы можете сделать что-то вроде ниже:
Array.from(set).some() or Array.from(set).every()
Для получения дополнительной информации о Массив против набора
Он изначально недоступен в прототипе Set, но если он вам часто нужен, вы можете легко расширить Set, чтобы добавить его.
class extendedSet extends Set{
every(f){
return Array.prototype.every.call([...this], f)
}
some(f){
return Array.prototype.some.call([...this], f)
}
}
let a_set = new extendedSet([1, 2, 3, 4]);
console.info(a_set.every(n => n < 2))
console.info(a_set.some(n => n < 2))
// still works as a Set
console.info(a_set.has(4))Другие ответы предлагают сначала преобразовать набор в массив, а затем использовать какой-либо метод массива. Это совершенно ненужно и даже неоптимально.
Вы можете использовать цикл for для самого экземпляра набора, выполнить итерацию по нему, найти элемент, соответствующий заданному условию, а затем разорвать цикл:
function some(set, predicate) {
for (const item of set)
if (predicate(item))
return true;
return false;
}
function every(set, predicate) {
for (const item of set)
if (!predicate(item))
return false;
return true;
}
const set = new Set([ 42, 17, -1, 8.3 ]);
every(set, (item) => typeof item === "number"); // true
every(set, (item) => item > 0); // false
some(set, (item) => item < 0); // true
some(set, (item) => item === 0); // false
Нет, если вы хотите, чтобы они использовали
Array.from(set).some()