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

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.


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

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)

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.


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.


5

Ich glaube, dies ist die sauberste und lesbarste Option:

var empty = [];
empty.some(x => x); //returns false

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


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


1

Verwenden Sie einfach Array.length:

var arr = [];

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

Siehe MDN


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.