2009-09-15 30 views
8

Jaka jest składnia dla indexOf(), aby przejść przez tablicę wielowymiarową? Na przykład:składnia indeksu dla tablic wielowymiarowych?

var x = []; 
// do something 
x.push([a,b]); 

x.indexOf(a) // ?? 

Chcę znaleźć 'a' i zrobić coś z 'b'. Ale to nie działa ... Ponieważ ta metoda powinna być iteratywna sama, nie zakładam, że użycie innej iteracji byłoby dobrą rzeczą do zrobienia. Obecnie symuluję to za pomocą 2 prostych tablic, ale myślę, że to powinno jakoś zadziałać ...

+0

starasz stworzyć słownik? Dlaczego nie skorzystać z obiektu? '{}' – Joel

+0

Czy któraś z czterech propozycji kodowania tego różni się dla ciebie? Po prostu ciekawy. – dlamblin

Odpowiedz

0

JavaScript nie ma tablic wielowymiarowych jako takich, więc x jest po prostu tablicą. Ponadto, metoda Array'a indexOf nie jest obsługiwana we wszystkich przeglądarkach, w szczególności w IE (przynajmniej w wersji 7), wprowadzana tylko w JavaScript 1.6.

Jedyną opcją jest wyszukiwanie ręcznie, iterowanie po x i badanie każdego elementu po kolei.

1

ile chcesz zachować porządek, to jest znacznie prostsze w użyciu słownika:

var x = {}; 

// do something 

x[a] = b; 

Nadal można iteracyjne nad klucze, chociaż kolejność jest niezdefiniowane:

for (var key in x) { 
    alert(x[key]); 
} 
+0

Użyj x [a] zamiast x.a. "a" nie jest nazwą kluczową, ale zmienną przechowującą klucz. –

+0

prawda. Naprawię to. –

0
x[ x.indexOf(a) ] 

Działa to tylko z zamówionymi obiektami/listami i tylko wtedy, gdy zdefiniowano Array.prototype.indexOf.

x = [1,2], b = {one:function(){alert('gj')}}, c = x.push(b); 

x[ x.indexOf(b) ]['one']() 
+0

Próbowałem tego, to nie działa z jakiegoś powodu ... – jirkap

+0

Cóż, musieliście zrobić to inaczej, ponieważ sposób w jaki to zrobiłem działa. Zauważyłem, że to * TYLKO * działa na tablicach, które są uporządkowane numerycznie i mają właściwość długości, a NIE na "wielowymiarowe" lub słowniki. –

+0

Uwaga - musisz również mieć odniesienie do oryginalnego obiektu, aby uzyskać odniesienie do "b", podobny obiekt o podobnych właściwościach jest wciąż inny. –

1

Można użyć obiektu (lub słownika), jak zasugerował Philippe Leybaert. Który pozwoli na szybki dostęp do elementów:

var x = {}; 

x[a] = b; // to set 

alert(x[a]) // to access 

Ale jeśli nalegać na użyciu indexOf, wciąż jest droga, jednak brzydka to:

var x = []; 

var o = Object(a); // "cast" to an object 
o.b = b; // attach value 

x.push(o); 

alert(x.indexOf(a)); // will give you the index 
alert(x[1].b); // access value at given index 
3

prostu: indexOf() nie działa w ten sposób. To może zadziałać, jeśli zrobiłeś coś takiego:

var x = []; 
// do something 
z = [a,b]; 
x.push(z); 

x.indexOf(z); 

Ale wtedy już miałbyś Z.B, prawda? Więc jeśli trzeba ignorować rady każdemu, kto uważa, że ​​korzystanie z obiektu (lub słownik) jest rzeczywiście łatwiej będziesz musiał użyć Ates Goral „s approach lub wyszukaj indeksu siebie:

Array.prototype.indexOf0 = 
    function(a){for(i=0;i<this.length;i++)if(a==this[i][0])return i;return null;}; 
var x = []; 
// do something 
x.push([a,b]); 

x.indexOf0(a); //=> 0 
Powiązane problemy