Javascript-Objekte sind wirklich praktisch, aber manchmal fehlen ihnen einige nützliche kleine Funktionen/Methoden. Das obige Beispiel bezieht sich auf Arrays. Es ist sehr nützlich zu wissen, ob ein Element in Ihrem Array enthalten ist oder nicht. Sie können eine Funktion schreiben, die das Array und das zu prüfende Element entgegennimmt, aber es ist viel sauberer, die Methode contains( item ) zum Array-Objekt hinzuzufügen.
JavaScript Arrays erweitern
/**
* Array.prototype.[method name] allows you to define/overwrite an objects method
* needle is the item you are searching for
* this is a special variable that refers to "this" instance of an Array.
* returns true if needle is in the array, and false otherwise
*/
Array.prototype.contains = function ( needle ) {
for (i in this) {
if (this[i] == needle) return true;
}
return false;
}
Verwendung
// Now you can do things like:
var x = Array();
if (x.contains('foo')) {
// do something special
}
Ich schlage vor, es strenger zu gestalten,
zu
zum Beispiel ist 1 dasselbe wie true. Es sei denn, Sie verwenden ===
Danke V1, Sie haben absolut Recht. Das sollte definitiv ein === sein.
„i“ sollte lokal deklariert werden (mit einer var-Anweisung). Derzeit setzen Sie es als globale Variable. Außerdem sollten Sie die „for(i in something)“-Konstruktion nicht für Arrays verwenden. Verwenden Sie stattdessen eine traditionelle for- oder while-Schleife; sie sind viel schneller.
Hier ist, wie ich es schreiben würde, was schlappe 83 KB minifiziert wiegt
Danke, es hat wirklich funktioniert.
Noch besser wäre es, es so zu schreiben
Meiner Meinung nach das Beste.
/**
* is_array
*
* @param mixed input
* @return bol
*/
function is_array(obj) {
if (obj.constructor.toString().indexOf(‘Array’) == -1) {
return false;
}
return true;
}
/**
* contains
*
* @param mixed input
* @param string value
* @return bol
*/
function contains(input, value) {
if (!is_array(input)) {
if (input.indexOf(value) != -1) {
return true;
}
}
else {
var i = input.length;
while (i–) {
if (input[i] === value) {
return true;
}
}
}
return false;
}
Ich folge lieber den Zeilen der String-indexOf-Methode.
Diese Funktionalität existiert bereits in den meisten Browsern, sodass Sie sie mit einer einfachen Feature-Erkennung zu nicht unterstützenden Browsern hinzufügen können
if(!Array.indexOf){ Array.prototype.indexOf = function(obj){ for(var i=0;i<this.length;i++){ if(this[i]==obj) return i; } return -1; } }Offensichtlich gibt dies kein boolesches Ergebnis zurück (if…!=-1), aber Sie möchten vielleicht die erste Position eines Objekts in einem Array kennen, also ist dies praktischer, wenn Sie bereits dabei sind, wissen Sie..
Sie können es modifizieren, um rückwärts im Array zu gehen, bei großen Arrays ist das Rückwärtsgehen normalerweise schneller (aus irgendeinem Grund), aber dann erhalten Sie den letzten Ort, an dem ein Objekt im Array erscheint.
var i = this.length; while(i--){ ... }Warum nicht die native indexOf()-Methode verwenden?
+1 für @black.
arr.indexOf(v) > -1sieht kurz und bündig aus.
indexOf() ist IE9+, Leute.
Die Sache ist, dass jeder, der etwas verwendet, das kein HTML5 unterstützt, ein veralteter Browser ist (und ja, mir ist bewusst, dass Mozilla hier zögert), und in der Realität ist die Unterstützung dieser alten Browser zwar schön, aber die tatsächliche Nutzung sinkt auf ein Niveau, bei dem die Kosten, der Nutzen, die Zeit und der Aufwand für die Wartung dieses Codes die wahrgenommenen Vorteile für eine sehr kleine Browser-Benutzergruppe überwiegen.
Ich würde mich mit dieser Methode, die die meisten Fälle abdeckt, zufriedengeben, einfach stringifizieren und dann testen.
… und wahrscheinlich Kritik mit dem üblichen, ja es gibt keine Prüfungen, man kann niemanden bevormunden, wenn Leute eine Funktion oder Code falsch verwenden, das ist deren Sache…
Wenn Sie es robuster machen wollen,
versuchenSie, diesen Weg zu gehen… :DDas Hinzufügen eines try & catch bedeutet, dass Sie Fehler kontrollieren, daher findet eine gewisse Überprüfung statt, obwohl es Ihnen überlassen bleibt, was es kontrolliert!
Verwenden Sie,
Wie Sie erwarten würden, ist das Ergebnis false, „Bread“ erscheint nicht in der Liste, daher ist die logische Antwort false.
So nützlich!! Vielen Dank, Bro! Guter Tipp
EcmaScript 6 hat Sie abgedeckt
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
Polyfill für ES5 im Link unter
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Array/includes#Polyfill
Ich würde noch eine weitere containsByKey(KeyName, KeyValue) für Objekte mit Schlüsseln hinzufügen, die darin gespeichert sind
Object.prototype.contains = function (key, value) {
//Verwendung
//selectedNodes.containsByKey(“node_id”, SelectedNode.node_id);
};