2012-02-14 10 views
22
var associativeArray = []; 

associativeArray['key1'] = 'value1'; 
associativeArray['key2'] = 'value2'; 
associativeArray['key3'] = 'value3'; 
associativeArray['key4'] = 'value4'; 
associativeArray['key5'] = 'value5'; 

var key = null; 
for(key in associativeArray) 
{ 
    console.log("associativeArray[" + key + "]: " + associativeArray[key]);   
} 

key = 'key3'; 

var obj = associativeArray[key];   

// gives index = -1 in both cases why? 
var index = associativeArray.indexOf(obj); 
// var index = associativeArray.indexOf(key); 

console.log("obj: " + obj + ", index: " + index); 

Powyższy program wyświetla indeks: -1, dlaczego? Czy istnieje lepszy sposób na uzyskanie indeksu obiektu w tablicy asocjacyjnej bez użycia pętli?javascript: jak uzyskać indeks obiektu w tablicy asocjacyjnej?

Co jeśli chcę usunąć "key3" z tej tablicy? funkcja splotu przyjmuje pierwszy parametr jako indeks, który musi być liczbą całkowitą.

+8

Nie ma tablicy asocjacyjnej w javascript. – Sarfraz

+0

możliwy duplikat [w obiekcie javascript, jaki jest najlepszy sposób uzyskania atrybutu wartości?] (Http://stackoverflow.com/questions/9052888/in-a-javascript-object-whats-best-way-to -get-the-attribute-of-a value) – user123444555621

+0

http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/ –

Odpowiedz

34

indexOf działa tylko z czystymi tablicami JavaScript, tj. Z indeksami całkowitymi. Twój „tablica” jest rzeczywiście obiekt i powinny zostać uznane jako takie

var associativeArray = {} 

Nie ma wbudowaną indexOf dla obiektów, ale jest to łatwe do napisania.

var associativeArray = {} 

associativeArray['key1'] = 'value1'; 
associativeArray['key2'] = 'value2'; 
associativeArray['key3'] = 'value3'; 
associativeArray['key4'] = 'value4'; 
associativeArray['key5'] = 'value5'; 

var value = 'value3'; 
for(var key in associativeArray) 
{ 
    if(associativeArray[key]==value) 
     console.log(key); 
} 

bez pętli (zakładając, że nowoczesne przeglądarki):

foundKeys = Object.keys(associativeArray).filter(function(key) { 
    return associativeArray[key] == value; 
}) 

zwraca wiele klawiszy, które zawierają daną wartość.

+1

Co jeśli chcę usunąć "key3" z tego szyk? funkcja splotu przyjmuje pierwszy parametr jako indeks, który musi być liczbą całkowitą. – gmuhammad

+2

@gmuhammad Metoda 'splice()' działa tylko na tablicach, a nie na obiektach. Będziesz musiał usunąć właściwość za pomocą 'delete associativeArray ['key3']', na przykład. – GregL

+3

thg435: Prawdopodobnie spowodowałeś trochę zamieszania, używając słowa "tablica" w nazwie zmiennej. Być może "associativeMap" może lepiej wyjaśnić, że jest to obiekt, a nie tablica? – GregL

2

Jeśli nie używasz jQuery, można przedłużyć prototyp Przedmiot ten sposób:

// Returns the index of the value if it exists, or undefined if not 
Object.defineProperty(Object.prototype, "associativeIndexOf", { 
    value: function(value) { 
     for (var key in this) if (this[key] == value) return key; 
     return undefined; 
    } 
}); 

Stosując ten sposób zamiast wspólnej Object.prototype.associativeIndexOf = ... będzie pracować z jQuery, jeśli używasz go.

I wtedy można go używać tak:

var myArray = {...}; 
var index = myArray.associativeIndexOf(value); 

będzie także współpracować z normalnych tablic: [...], więc można go używać zamiast indexOf też.

Pamiętaj, aby używać operatorów triple-znakowe, by sprawdzić, czy to niezdefiniowane:

index === undefined // to check the value/index exists  
index !== undefined // to check the value/index does not exist 

Oczywiście można zmienić nazwę funkcji, jeśli wolisz, aby na przykład keyOf, i pamiętać, by nie zadeklarować zmienną nazywany "niezdefiniowanym".

Powiązane problemy