【问题标题】:Javascript Array.some() and Array.every() equivalent for Set?Javascript Array.some() 和 Array.every() 等效于 Set?
【发布时间】:2019-05-11 22:57:15
【问题描述】:

在 JavaScript 中,Set 内置对象是否有 Array.some()Array.every() 的等价物?

【问题讨论】:

  • 不,如果你想要那些使用Array.from(set).some()

标签: javascript arrays set


【解决方案1】:

不,Set.prototype are 上唯一的内置方法:

Set.prototype​.add()
Set.prototype​.clear()
Set.prototype​.delete()
Set.prototype​.entries()
Set.prototype​.for​Each()
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)
);

【讨论】:

    【解决方案2】:

    它在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))

    【讨论】:

      【解决方案3】:

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#MethodsSet 的可用方法列表的文档

      方法:

      Set.prototype​.add()

      Set.prototype​.clear()

      设置.prototype​.delete()

      Set.prototype​.entries()

      Set.prototype​.for​Each()

      Set.prototype​.has()

      Set.prototype​.values()

      Set.prototype​@@iterator

      在您的上下文中,您可以执行以下操作:

       Array.from(set).some() or Array.from(set).every()
      

      更多关于Array vs Set的信息

      【讨论】:

        【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2021-06-05
          • 1970-01-01
          • 2015-01-12
          • 2011-01-19
          • 1970-01-01
          • 1970-01-01
          • 2017-12-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多