2015-02-05 393 views
21

我正在寻找的JavaScript时,它是空的返回true或false的方法..像红宝石any?empty?东西Array.any是什么?针对JavaScript

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

它的时间来改变接受的答案,我认为;) – asiniy 2016-10-10 10:56:55

回答

8

的Javascript标准库比较差o ruby​​的Enumerable,大部分的东西都应该用手写。光明的一面,在大多数情况下这是微不足道的。

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

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

图书馆像下划线已经提供包装这样的,如果你已经习惯了Ruby的收集方法,这是有道理的,包括他们在您的项目。

正如@Pointy指出的,JS阵列不是列表,它们只是带有数字键的对象,而length定义为max(keys) + 1。因此,真正的收集方法可以给出令人惊讶的结果(就像这种语言中的其他一切)。

+10

已经有'.some()',它和'.any()'基本相同。 – Pointy 2015-02-05 17:36:50

+6

@Pointy:你可能想看看我是如何实现'任何';) – georg 2015-02-05 17:37:32

+4

Oh durr。回到咖啡壶。 – Pointy 2015-02-05 17:38:22

1

阵列具有length property

[].length // 0 
[0].length // 1 
[4, 8, 15, 16, 23, 42].length // 6 
2
var a = []; 
a.length > 0 

我只是检查一下长度。如果你愿意的话,你可以用辅助方法把它包装起来。

1

只需使用Array.length

var arr = []; 

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

MDN

2

如果你真的想要得到坚果,添加一个新方法的原型:

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

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

DEMO

+0

谢谢你的帮助。我发现[这里](http://stackoverflow.com/a/7924304/3622415)Array.compact(我住在Ruby区域),他们说!!(任何真理)都会返回true,所以它可能就是这样的! !array.filter(function(e){return e})。length? – kangkyu 2015-02-07 01:34:34

+0

if(!('Array.prototype'中的'any?')){Array.prototype.any? = function(){return !! this.filter(function(e){return e})。length;};} ....我试过这个不起作用urgh – kangkyu 2015-02-07 01:48:02

+0

[为什么不使用georg's?] (http://stackoverflow.com/a/28350435/1377002)另外,我不认为你可以在方法名称中有问号。 – Andy 2015-02-07 02:23:01

4

即使数组长度不为零,JavaScript数组也可以是“空的”。例如:

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

变量“的howmany”将被设定为0,即使阵列初始化为具有10的长度。

因此,由于许多阵列迭代函数只注重实际已赋值的数组的元素,你可以使用这样的呼叫.some()看到如果一个数组中有什么实际:

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

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

33

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 
+1

谢谢,我现在看到'[12,5,8,1,4] .some(function(e){return e> 10;});'working! – kangkyu 2016-01-05 10:01:38

+0

@ kangkyu我认为是时候接受这个答案;) – asiniy 2016-08-05 13:23:55

+1

对不起,迟到的回应,但@asiniy我仍然认为接受的答案应该被接受,因为它有更多的细节(包括一些()'),可以更有帮助给他人。 – kangkyu 2016-11-03 17:36:02

0

填充工具*:

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

如果你要称呼其为红宝石,这意味着.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

1

你想要的是.empty.empty()完全模仿红宝石:

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

然后

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

对于任何,看到我的回答here

1

我有点迟到了,但是......

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