2015-02-05 398 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)