什么是Array.any?对于javascript


77

我在寻找的JavaScript返回true或false的方法时,它是空的..像红宝石any?empty?

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

Answers:


38

JavaScript具有以下Array.prototype.some()方法:

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

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

通常,与Ruby的Enumerable相比,JavaScript标准库中的Array非常差。没有方法,要求您传入函数,否则会出错。您可以定义自己的对象,也可以定义更接近Ruby的对象,如下所示:isEmpty.some()undefined is not a function.isEmpty().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的collection方法,则将它们包括在项目中可能是有意义的。


112

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

1
谢谢,我看到现在[12,5,8,1,4].some(function(e){ return e > 10;});正在工作!
kangkyu

4
@kangkyu我认为是时候接受这个答案了;)
asiniy

4
抱歉,您的回复很晚,但是@asiniy我仍然认为应该接受接受的答案,因为它包含更多详细信息(包括some()),并且可能对其他人有帮助。
kangkyu

9
@kangkyu除了当前接受的答案花在尝试成为Ruby-ish上的时间比实际提供javascript答案要花费更多的时间。它还建议您编写自己的包装器(实际上没有必要),并且以可能有害的方式编写(例如,将原型扩展为非polyfill的东西)
Jasper

2
@LokiKriasus扩展原型可能会导致将来的问题(即,如果将来javascript定义了一种any()方法,并且有人使用它,那么与使用此代码的库一起使用时,该代码可能会以怪异的方式失败,因为您对它的定义稍有不同)和创建其他(javascript)开发人员难以阅读的代码。这种方法的全部原因是,Ruby开发人员拒绝了解他们应该写some()而不是写,any()并且即使数组为空,他们也不应忘记将函数传递给它……
Jasper

22

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

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

2
我猜这不太适合[false, 0, '', null, undefined]
Brook Jordan

@BrookJordan效果很好。返回false。其中的零值得怀疑,但对于其余部分,我相信这是OP所追求的功能。寻找“真实的”实体。
Dudo

好的,我想我误会了。当我读空的时候我想起[,,,]。我想!!那时甚至根本不需要。
布鲁克·乔丹

1
另一种可能更漂亮的书写方式:[].some(x => Boolean)
phil294

1
@ phil294应该是[].some(Boolean)
Gershy


6

从某种意义上说,即使数组的长度非零,JavaScript数组也可以是“空”的。例如:

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

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

因此,由于许多Array迭代函数仅关注实际上已分配了值的数组元素,因此可以使用类似此调用的方法.some()来查看数组中是否实际包含任何东西:

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

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



3

如果您真的想发疯,请在原型中添加一个新方法:

if (!('empty' in Array.prototype)) {
  Array.prototype.empty = function () {
    return this.length === 0;
  };
}

[1, 2].empty() // false
[].empty() // true

演示


谢谢你的帮助。我在这里找到Array.compact(我住在Ruby地区),他们说!!(没什么大不了的)返回true,所以可能是!! array.filter(function(e){return e})。length吗?
kangkyu 2015年

if(!('any?'在Array.prototype中))){Array.prototype.any?= function(){return !! this.filter(function(e){return e})。length;};} .......我尝试过这没用
kangkyu 2015年

您为什么不使用georg's?另外,我认为方法名称中不能带有问号。
安迪

1
if (!('any' in Array.prototype)) { Array.prototype.any = function () {return !!this.filter(function(e){ return e }).length;};}这就像Array.any()谢谢你安迪
kangkyu 2015年


1

只需使用Array.length

var arr = [];

if (arr.length)
   console.log('not empty');
else
   console.log('empty');

MDN


1

您想要的.empty不是.empty()完全模仿Ruby:

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

然后

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

对于任何,请在这里查看我的答案


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.