【发布时间】:2019-05-11 22:57:15
【问题描述】:
在 JavaScript 中,Set 内置对象是否有 Array.some() 和 Array.every() 的等价物?
【问题讨论】:
-
不,如果你想要那些使用
Array.from(set).some()
标签: javascript arrays set
在 JavaScript 中,Set 内置对象是否有 Array.some() 和 Array.every() 的等价物?
【问题讨论】:
Array.from(set).some()
标签: javascript arrays set
不,Set.prototype are 上唯一的内置方法:
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.log(
allPositive(set1),
allPositive(set2)
);
【讨论】:
它在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.log(a_set.every(n => n < 2))
console.log(a_set.some(n => n < 2))
// still works as a Set
console.log(a_set.has(4))
【讨论】:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#Methods 是Set 的可用方法列表的文档
方法:
Set.prototype.add()
Set.prototype.clear()
设置.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()
更多关于Array vs Set的信息
【讨论】:
其他答案建议首先将集合转换为数组,然后使用某种数组方法。这是完全没有必要的,甚至是次优的。
您可以在集合实例本身上使用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
【讨论】: