什么是Array.any?对于JavaScript

kan*_*kyu 47 javascript

我正在寻找一个javascript返回true或false的方法,当它为空时......像Ruby any?或者empty?

[].any? #=> false
[].empty? #=> true
Run Code Online (Sandbox Code Playgroud)

asi*_*niy 85

JavaScript本机.some()方法完全符合您的要求:

function isBiggerThan10(element, index, array) {
  return element > 10;
}

[2, 5, 8, 1, 4].some(isBiggerThan10);  // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true
Run Code Online (Sandbox Code Playgroud)

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

geo*_*org 15

与ruby的Enumerable相比,Javascript标准库相当差,大多数东西应该是手工编写的.从好的方面来说,这在大多数情况下都是微不足道的.

 Array.prototype.isEmpty = function() {
     return !this.length;
 }

 Array.prototype.any = function(func) {
    return this.some(func || function(x) { return x });
 }
Run Code Online (Sandbox Code Playgroud)

像下划线这样的库已经提供了这样的包装器,如果你已经习惯了ruby的收集方法,那么将它们包含在你的项目中是有意义的.

正如@Pointy指出的那样,JS数组不是列表,它们只是带有数字键的对象并被length定义为max(keys) + 1.因此,真正的收集方法可以产生令人惊讶的结果(就像这种语言中的其他所有内容一样).

  • 已经有了`.some()`,它与`.any()`基本相同. (27认同)
  • @Pointy:你可能想看看我如何实现`any`;) (12认同)
  • 哦,durr.回到咖啡壶. (5认同)
  • 伙计,你为什么甚至建议这样的事情?人们会复制它,因为它是公认的答案,但这个"别名"是完全错误的.只是建议使用'some'代替 (3认同)
  • 不要扩展本机类型的原型!/sf/ask/982392631/ (3认同)

Dud*_*udo 14

我参加派对有点晚了,但......

[].some(x => !!x)
Run Code Online (Sandbox Code Playgroud)

  • @phil294 它应该是 `[].some(Boolean)` (5认同)
  • 我想这与 `[false, 0, '', null, undefined]` 配合得不好 (4认同)
  • 另一种可以说更漂亮的写法:“[].some(x => Boolean)” (2认同)

TGH*_*TGH 7

var a = [];
a.length > 0
Run Code Online (Sandbox Code Playgroud)

我只想查看长度.如果您愿意,可以将其包装在辅助方法中.


Poi*_*nty 6

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

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

变量"howMany"将被设置为0,即使数组被初始化为长度为10.

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

var hasSome = empty.some(function(e) { return true; });
Run Code Online (Sandbox Code Playgroud)

传递给它的回调.some()true在每次调用时返回,因此如果迭代机制找到值得检查的数组元素,结果将是true.


Ped*_*lho 6

我相信这是最干净和可读的选项:

var empty = [];
empty.some(x => x); //returns false
Run Code Online (Sandbox Code Playgroud)

  • `empty.some(x => true)` 将适用于 `[undefined, null, false, 0]` (3认同)
  • 如果空值包含假值怎么办? (2认同)

hai*_*770 5

只需使用Array.length

var arr = [];

if (arr.length)
   console.log('not empty');
else
   console.log('empty');
Run Code Online (Sandbox Code Playgroud)

参见MDN