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:
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.
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
some()) und für andere hilfreicher sein kann.
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 ...
Ich bin etwas spät zur Party, aber ...
[].some(x => !!x)
[false, 0, '', null, undefined]
[,,,]. Ich denke, das !!ist dann nicht wirklich erforderlich.
[].some(x => Boolean)
[].some(Boolean)
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.
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.
Ich glaube, dies ist die sauberste und lesbarste Option:
var empty = [];
empty.some(x => x); //returns false
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
if (!('any' in Array.prototype)) { Array.prototype.any = function () {return !!this.filter(function(e){ return e }).length;};}Dies funktioniert als Array.any()Danke Andy
Array hat eine Längeneigenschaft :
[].length // 0
[0].length // 1
[4, 8, 15, 16, 23, 42].length // 6
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
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) }
} );
__ __
[12,5,8,1,4].some(function(e){ return e > 10;});arbeiten!