Eine Verwendung, die ich etwas schwierig finde, ist

2 in [1, 3, 5]

for (var i in [1, 3, 5]) { ... }

str = "hello";
for (var i in str) { ... }

Die erste Zeile ist true (ich hätte sofort sagen können, dass 2 in [1, 3, 5] false ist), und die zweite Zeile durchläuft 0, 1, 2 anstelle von 1, 3, 5 und die letzte Teil durchläuft 0 bis 4 anstelle von 'h', 'e', 'l', 'l', 'o'. Im Moment verwende ich nur: Wenn Sie in für ein Array oder eine For-In-Schleife für ein Array sehen, denken Sie stattdessen sofort an den Index. Gibt es ansonsten einen Weg oder ein Verwendungsmuster, mit dem wir diese Gefahr vermeiden können?

1
nonopolarity 7 Okt. 2012 im 17:01

3 Antworten

Beste Antwort

Ja, es heißt "Verwenden Sie in nicht für Arrays" . Es wird getestet, ob ein Objekt einen bestimmten Schlüssel hat. Sie können ihn daher nicht ordnungsgemäß für Arrays verwenden.

Sie sollten auch for(var x in something) nicht verwenden, es sei denn, Sie möchten die Eigenschaften von something durchlaufen.

Um zu überprüfen, ob ein Wert in einem Array enthalten ist, verwenden Sie ~arr.indexOf(value) - oder arr.IndexOf(value) != -1, wenn Sie es ausführlicher wünschen.

Verwenden Sie for(var i = 0; i < arr.length; i++), um die Elemente in einem Array zu durchlaufen.

2
ThiefMaster 7 Okt. 2012 im 13:08

Das Schlüsselwort in soll für Objekte wie dieses verwendet werden (entnommen aus MDN-Site)

// Arrays
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees;        // returns true
3 in trees;        // returns true
6 in trees;        // returns false
"bay" in trees;    // returns false (you must specify the index number,
                  // not the value at that index)
"length" in trees; // returns true (length is an Array property)

// Predefined objects
"PI" in Math;          // returns true
var myString = new String("coral");
"length" in myString;  // returns true

// Custom objects
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar;  // returns true
"model" in mycar; // returns true

Ein Array kann als Objekt betrachtet werden. Das Array ['zero', 'one', 'two'] ähnelt dem Objekt {0: 'zero', 1: 'one', 2: 'two'}

Wenn Sie also for (i in ['zero', 'one', 'two']) Javascript schreiben, wird es so behandelt, als hätten Sie for (i in {0: 'zero', 1: 'one', 2: 'two'}) geschrieben.

Sie können überprüfen, ob ein Objekt einen bestimmten Eigenschaftswert wie folgt hat:

function isIn(val, obj) {
  for (var i in obj) if (obj[i] == val) return true;
  return false;
}

isIn('car', ['car', 'horse']) // returns true

Wenn Sie speziell ein Array und nicht nur ein beliebiges Objekt überprüfen, können Sie indexOf Methode, die den Index ihres Arguments zurückgibt oder -1 des Arrays enthält das Argument nicht.

function isInArray(val, arr) {return arr.indexOf(val) > -1;}

isIn('car', ['car', 'horse']) // returns true
1
Daniel Patru 8 Okt. 2012 im 16:03

Sie können die Methode indexOf verwenden. jsfiddle

Für Array

var arr = [1,2,3,4];
arr.indexOf(2); // will return index of item if exist other wise return -1;

Für String

var str = 'Hello world';
str.indexOf('e')
console.log(str.indexOf('e'),str.indexOf('n'));

.

1
Anoop 7 Okt. 2012 im 13:08