Was ist Array.any? für Javascript

74

Ich suche nach einer Methode für Javascript, die true oder false zurückgibt, wenn es leer ist. So etwas wie Ruby any?oderempty?

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

Antworten:

34

JavaScript hat die Array.prototype.some()Methode:

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

Gibt zurück, trueweil das Array (mindestens) eine gerade Zahl enthält.

Im Allgemeinen ist die ArrayKlasse in der Standardbibliothek von JavaScript im Vergleich zu Ruby's Enumerable ziemlich schlecht . Es gibt keine isEmptyMethode und .some()erfordert, dass Sie eine Funktion übergeben, sonst wird eine undefined is not a functionFehlermeldung angezeigt. Sie können Ihre eigenen .isEmpty()sowie eine definieren .any(), die Ruby's näher kommt:

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

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

Bibliotheken wie underscore.js und lodash bieten Hilfsmethoden wie diese. Wenn Sie an Rubys Erfassungsmethoden gewöhnt sind, ist es möglicherweise sinnvoll, sie in Ihr Projekt aufzunehmen.

Georg
quelle
112

Die native JavaScript- .some()Methode macht genau das, wonach Sie suchen:

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

[2, 5, 8, 1, 4].some(isBiggerThan10);  // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true
Asiniy
quelle
1
Danke, ich sehe jetzt [12,5,8,1,4].some(function(e){ return e > 10;});arbeiten!
Kangkyu
4
@ Kangkyu Ich denke, es ist Zeit, diese Antwort zu akzeptieren;)
Asiniy
4
Entschuldigung für die verspätete Antwort, aber @asiniy Ich denke immer noch, dass die akzeptierte Antwort hätte akzeptiert werden sollen, da sie mehr Details enthält (einschließlich some()) und für andere hilfreicher sein kann.
Kangkyu
9
@kangkyu Außer, dass die derzeit akzeptierte Antwort mehr Zeit damit verbringt, Ruby-ish zu sein, als tatsächlich eine Javascript-Antwort zu geben. Es wird auch empfohlen, einen eigenen Wrapper zu schreiben (was wirklich nicht erforderlich ist) und dies auf potenziell schädliche Weise (dh Erweiterung des Prototyps für etwas, das keine Polyfüllung ist)
Jasper
2
@LokiKriasus Das Erweitern des Prototyps kann zu zukünftigen Problemen führen (dh wenn in Zukunft Javascript eine any()Methode definiert und jemand sie verwendet, kann dieser Code auf seltsame Weise fehlschlagen, wenn er zusammen mit einer Bibliothek verwendet wird, die diesen Code verwendet, weil Sie ihn etwas anders definiert haben) und Erstellt Code, der für andere (Javascript-) Entwickler schwerer zu lesen ist. Und der ganze Grund für diesen Ansatz ist, dass ein Ruby-Entwickler sich weigerte zu lernen, dass er some()statt schreiben sollte any()und dass er nicht vergessen sollte, eine Funktion an ihn zu übergeben, selbst wenn das Array leer ist ...
Jasper
20

Ich bin etwas spät zur Party, aber ...

[].some(x => !!x)
Dudo
quelle
2
Ich denke, das spielt nicht gut mit[false, 0, '', null, undefined]
Brook Jordan
Es funktioniert wunderbar, @BrookJordan. Es wird false zurückgegeben. Die Null dort ist fraglich, aber im Übrigen glaube ich, dass dies die Funktionalität ist, nach der OP gesucht hat. Auf der Suche nach "wahrheitsgemäßen" Wesenheiten.
Dudo
Ah ok, ich glaube ich habe leer falsch verstanden. Wenn ich leer lese, denke ich an [,,,]. Ich denke, das !!ist dann nicht wirklich erforderlich.
Brook Jordan
eine andere, wohl schönere Art, dies zu schreiben:[].some(x => Boolean)
phil294
@ phil294 sollte es sein[].some(Boolean)
Gershom
7
var a = [];
a.length > 0

Ich würde nur die Länge überprüfen. Sie können es möglicherweise in eine Hilfsmethode einwickeln, wenn Sie möchten.

TGH
quelle
Ich denke, das Problem ist hier, wenn Sie ein großes Array haben, zählen Sie alle Elemente unnötig
Snr
@Snr Alle wichtigen Dolmetscher bieten effiziente Accessoren für die Länge von Arrays: stackoverflow.com/questions/9592241/…
Nazareno Lorenzo
6

JavaScript-Arrays können gewissermaßen "leer" sein, selbst wenn die Länge des Arrays ungleich Null ist. Zum Beispiel:

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

Die Variable "howMany" wird auf gesetzt 0, obwohl das Array mit einer Länge von initialisiert wurde 10.

Da viele der Array-Iterationsfunktionen nur Elemente des Arrays berücksichtigen, denen tatsächlich Werte zugewiesen wurden, können Sie mit diesem Aufruf .some()überprüfen, ob in einem Array tatsächlich etwas enthalten ist:

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

Der an übergebene Rückruf .some()wird bei truejedem Aufruf zurückgegeben. Wenn der Iterationsmechanismus also ein Element des Arrays findet, das überprüft werden sollte, ist das Ergebnis true.

Spitze
quelle
5

Ich glaube, dies ist die sauberste und lesbarste Option:

var empty = [];
empty.some(x => x); //returns false
Pedro Coelho
quelle
Was ist, wenn leer falsche Werte enthält?
Tom Hale
3

Wenn Sie wirklich verrückt werden möchten, fügen Sie dem Prototyp eine neue Methode hinzu:

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

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

DEMO

Andy
quelle
Danke für die Hilfe. Ich habe hier für Array.compact gefunden (ich lebe im Ruby-Gebiet) und sie sagen !! (alles, was wahr ist) gibt true zurück, also könnte es so etwas wie !! array.filter (Funktion (e) {return e}) sein. Länge?
Kangkyu
if (! ('any?' in Array.prototype)) {Array.prototype.any? = function () {return !! this.filter (function (e) {return e}). length;};} .... Ich habe versucht, dass dies nicht funktioniert hat urgh
kangkyu
Warum benutzt du nicht Georgs? Ich glaube auch nicht, dass Sie Fragezeichen in Methodennamen haben können.
Andy
1
if (!('any' in Array.prototype)) { Array.prototype.any = function () {return !!this.filter(function(e){ return e }).length;};}Dies funktioniert als Array.any()Danke Andy
Kangkyu
2

Array hat eine Längeneigenschaft :

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

Verwenden Sie einfach Array.length:

var arr = [];

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

Siehe MDN

haim770
quelle
1

Was Sie wollen, ist , Ruby .emptynicht .empty()vollständig nachzuahmen:

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

dann

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

Für jeden siehe meine Antwort hier

Abdennour TOUMI
quelle
0

Polyfill *:

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

Wenn Sie es als Ruby bezeichnen möchten, bedeutet .anydies .any(): Verwenden Sie:

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

Abdennour TOUMI
quelle