【问题标题】:What is the equivalent of Array.any? in JavaScript?Array.any 的等价物是什么?在 JavaScript 中?
【发布时间】:2021-10-10 02:41:50
【问题描述】:

我正在寻找一种 JavaScript 方法,当它为空时返回 true 或 false ......类似于 Ruby any?empty?

[].any? #=> false
[].empty? #=> true

【问题讨论】:

    标签: javascript


    【解决方案1】:

    JavaScript 原生 .some() method 完全符合您的要求:

    function isBiggerThan10(element, index, array) {
      return element > 10;
    }
    
    [2, 5, 8, 1, 4].some(isBiggerThan10);  // false
    [12, 5, 8, 1, 4].some(isBiggerThan10); // true
    

    【讨论】:

    • 谢谢,我现在看到[12,5,8,1,4].some(function(e){ return e > 10;}); 工作了!
    • @kangkyu 我认为是时候接受这个答案了;)
    • 抱歉回复晚了,但@asiniy 我仍然认为接受的答案应该被接受,因为它有更多的细节(包括some())并且可以对其他人更有帮助。
    • @kangkyu 除了当前接受的答案花费更多时间尝试成为 Ruby 风格,而不是实际给出 javascript 答案。它还建议编写你自己的包装器(这真的不是必需的)并且以潜在有害的方式这样做(即扩展原型以用于不是polyfill的东西)
    • @LokiKriasus 扩展原型可能会导致未来的问题(即,如果将来 javascript 定义了一个 any() 方法,并且有人使用它,那么当与一个库一起使用时,该代码可能会以奇怪的方式失败使用此代码是因为您对它的定义略有不同)并创建了其他(javascript)开发人员难以阅读的代码。这种方法的全部原因是Ruby开发人员拒绝学习他们应该写some()而不是any(),并且即使数组是空的,他们也不应该忘记将函数传递给它......
    【解决方案2】:

    JavaScript 有 Array.prototype.some() 方法:

    [1, 2, 3].some((num) => num % 2 === 0);  
    

    返回true,因为数组中有(至少)一个偶数。

    一般来说,JavaScript 标准库中的 Array class 与 Ruby 的 Enumerable 相比相当差。没有isEmpty 方法,.some() 要求你传入一个函数,否则你会得到一个undefined is not a function 错误。您可以像这样定义自己的.isEmpty() 以及更接近Ruby 的.any()

    Array.prototype.isEmpty = function() {
        return this.length === 0;
    }
    
    Array.prototype.any = function(func) {
       return this.some(func || function(x) { return x });
    }
    

    underscore.jslodash 这样的库提供了这样的辅助方法,如果您习惯了 Ruby 的收集方法,那么将它们包含在您的项目中可能是有意义的。

    【讨论】:

      【解决方案3】:

      我参加聚会有点晚了,但是...

      [].some(x => !!x)
      

      【讨论】:

      • 我猜这与[false, 0, '', null, undefined] 不兼容
      • 效果很好,@BrookJordan。它返回假。那里的零是有问题的,但对于其余的,我相信这是 OP 所追求的功能。寻找“真实”的实体。
      • 啊,好吧,我想我误会了。当我阅读空白时,我会想到[,,,]。我想!! 那时甚至都不需要。
      • 另一种可以说是更漂亮的写法:[].some(x => Boolean)
      • @phil294 应该是[].some(Boolean)
      【解决方案4】:
      var a = [];
      a.length > 0
      

      我只是检查长度。如果您愿意,您可以将其包装在辅助方法中。

      【讨论】:

      • 我认为问题就在这里,如果你有一个大数组,你会不必要地计算所有元素
      • @Snr 所有主要的解释器都为数组长度提供了高效的访问器:stackoverflow.com/questions/9592241/…
      • 这实际上是所有建议使用some 的人之外最简单和最好的答案。 KISS原则!
      【解决方案5】:

      JavaScript 数组在某种意义上可以是“空的”,即使数组的长度不为零。例如:

      var empty = new Array(10);
      var howMany = empty.reduce(function(count, e) { return count + 1; }, 0);
      

      变量“howMany”将设置为0,即使数组已初始化为长度为10

      因此,由于许多 Array 迭代函数只关注数组中实际被赋值的元素,您可以使用类似这样的调用 .some() 来查看数组中是否实际包含任何内容:

      var hasSome = empty.some(function(e) { return true; });
      

      传递给.some() 的回调在被调用时将返回true,因此如果迭代机制发现数组中的元素值得检查,则结果将为true

      【讨论】:

        【解决方案6】:

        我相信这是最简洁易读的选项:

        var empty = [];
        empty.some(x => x); //returns false
        

        【讨论】:

        • 如果空包含虚假值怎么办?
        • empty.some(x => true) 适用于 [undefined, null, false, 0]
        • @TomHale [false, 0, "", undefined, null, NaN].some(x => x) 返回错误
        • 如果您想将这些值视为有效,请使用 Holden 所说的:empty.some(x => true)
        【解决方案7】:

        如果你真的想疯了,在原型中添加一个新方法:

        if (!('empty' in Array.prototype)) {
          Array.prototype.empty = function () {
            return this.length === 0;
          };
        }
        
        [1, 2].empty() // false
        [].empty() // true
        

        DEMO

        【讨论】:

        • 感谢您的帮助。我为 Array.compact 找到了here(我住在 Ruby 地区),他们说 !!(anything truthy) 返回 true,所以它可能类似于 !!array.filter(function(e){ return e })。长度?
        • if (!('any?' in Array.prototype)) { Array.prototype.any? = function () {return !!this.filter(function(e){ return e }).length;};} .... 我试过这不起作用 urgh
        • Why don't you use georg's? 另外,我认为方法名称中不能有问号。
        • if (!('any' in Array.prototype)) { Array.prototype.any = function () {return !!this.filter(function(e){ return e }).length;};} 这是Array.any() 谢谢安迪
        【解决方案8】:

        只需使用Array.length:

        var arr = [];
        
        if (arr.length)
           console.log('not empty');
        else
           console.log('empty');
        

        MDN

        【讨论】:

          【解决方案9】:

          你想要的是 .empty 而不是 .empty() 来完全模仿 Ruby:

               Object.defineProperty( Array.prototype, 'empty', {
                     get: function ( ) { return this.length===0 }
                } );    
          

          然后

          [].empty //true
          [3,2,8].empty //false
          

          any请看我的回答here

          【讨论】:

            【解决方案10】:

            数组有一个length property

            [].length // 0
            [0].length // 1
            [4, 8, 15, 16, 23, 42].length // 6
            

            【讨论】:

              【解决方案11】:

              polyfill*:

              Array.prototype.any=function(){
                  return (this.some)?this.some(...arguments):this.filter(...arguments).reduce((a,b)=> a || b)
              };
              

              如果您想将其称为 Ruby,即表示 .any 而不是 .any(),请使用:

              Object.defineProperty( Array.prototype, 'any', {
                get: function ( ) { return (this.some)?this.some(function(e){return e}):this.filter(function(e){return e}).reduce((a,b)=> a || b) }
              } ); 
              

              __

              `* : https://en.wikipedia.org/wiki/Polyfill

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-08-11
                • 2014-12-06
                • 2011-04-23
                • 2013-07-01
                相关资源
                最近更新 更多