2013-06-21 18 views
17

Im Empfangen von JSON-Daten, die durch numerische Indizes aggregiert werden. Wenn Im beispielsweise in meinem Forloop ist, könnte der Index bei 1 beginnen, was bedeutet, dass in meinem Forloop ein Fehler auftreten würde, weil 0 nicht existiert. Wie überprüfe ich, ob im JavaScript-Array ein numerischer Index existiert?Suche nach einem numerischen Index in einem Javascript-Array

+0

wir ein Beispiel dieser json Daten sehen – Musa

+1

Wie könnte ein Index * nicht * in einem Array existiert? Was du meinst ist es ist Wert "undefiniert", richtig? – acdcjunior

+1

Bitte poste ein Beispiel. Beschreibungen von Problemen in Fragen sind oft ohne konkrete Beispiele schwer zu beantworten. – CodeMonkeyKing

Antwort

27
var a = [1, 2, 3], 
    index = 2; 

if (a[index] !== void 0) { /* void 0 === undefined 
           * See concern about ``undefined'' below. */ 
    /* index doesn't point to an undefined item. */ 
} 
+1

Oder 'if (index in a)' würde technisch auf Existenz prüfen, obwohl Ihre '! == undefined' Prüfung wird wahrscheinlich ausreichen. –

+0

typeof a [index]! == 'undefined' sollte sicherer sein – Aubin

+3

@Aubin Warum? Wenn "a" nicht definiert ist, wird es beim Versuch, auf "[index]" zuzugreifen, genauso fehlerhaft sein. – andlrc

6

Sie sollten for(key in data)

var data = []; 
data[1] = 'a'; 
data[3] = 'b'; 

for(var index in data) { 
    console.log(index+":"+data[index]); 
} 
//Output: 
// 1-a 
// 3-b 

verwenden können, die in Daten Schleife über jeden Schlüsselpunkt, wenn die Indizes nicht zusammenhängend sind.

0

Wenn Sie wirklich, was beschreiben eher ein Object ist als ein Array, ist aber Array wie in der Tatsache, dass es Eigenschaften hat, die von uint32_t sind, aber nicht wesentlich length Eigenschaft vorhanden. Dann könnten Sie es in ein echtes Array wie folgt umwandeln. Browser-Kompatibilität weise erfordert diese Unterstützung von hasOwnProperty

Javascript

function toArray(arrayLike) { 
    var array = [], 
     i; 

    for (i in arrayLike) { 
     if (Object.prototype.hasOwnProperty.call(arrayLike, i) && i >= 0 && i <= 4294967295 && parseInt(i) === +i) { 
      array[i] = arrayLike[i]; 
     } 
    } 

    return array; 
} 

var object = { 
    1: "a", 
    30: "b", 
    50: "c", 
}, 
array = toArray(object); 

console.log(array); 

Ausgabe

[1: "a", 30: "b", 50: "c"] `

Auf jsfiddle

Ok, jetzt haben Sie eine dünn besiedelte Matrix und wollen Verwenden Sie eine for Schleife, um etwas zu tun.

Javascript

var array = [], 
    length, 
    i; 

array[1] = "a"; 
array[30] = "b"; 
array[50] = "c"; 

length = array.length; 
for (i = 0; i < length; i += 1) { 
    if (Object.prototype.hasOwnProperty.call(array, i)) { 
     console.log(i, array[i]); 
    } 
} 

Ouput

1 "a" 
30 "b" 
50 "c" 

Auf jsfiddle

Alternativ können Sie Array.prototype.forEach verwenden, wenn Ihr Browser es, oder die verfügbare Shim auf der MDN Seite als gegeben unterstützt, dass ich verbunden oder es5_shim

Javascript

var array = []; 

array[1] = "a"; 
array[30] = "b"; 
array[50] = "c"; 

array.forEach(function (element, index) { 
    console.log(index, element); 
}); 

Ausgabe

1 "a" 
30 "b" 
50 "c" 

Auf jsfiddle

+0

Auto, um die Down-Abstimmung zu erklären? – Xotic750