2012-02-14 20 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); 

El programa anterior imprime el índice: -1, ¿por qué? ¿Hay alguna forma mejor de obtener el índice de un objeto en una matriz asociativa sin usar bucles?javascript: ¿cómo obtener el índice de un objeto en una matriz asociativa?

¿Qué sucede si deseo eliminar 'key3' de esta matriz? la función de empalme toma el primer parámetro como índice, que debe ser un número entero.

+8

No hay una matriz asociativa en javascript. – Sarfraz

+0

posible duplicado de [en un objeto javascript, ¿cuál es la mejor forma de obtener el atributo de un valor?] (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/ –

Respuesta

34

indexOf solo funciona con matrices de Javascript puro, es decir, aquellas con índices enteros. Su "matriz" es en realidad un objeto y debe ser declarada como tal

var associativeArray = {} 

no hay una función de indexOf para los objetos, pero es fácil de escribir.

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); 
} 

Sin bucles (suponiendo un navegador moderno):

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

devuelve una matriz de claves que contienen el valor dado.

+1

¿Qué pasa si quiero eliminar 'key3' de este ¿formación? la función de empalme toma el primer parámetro como índice, que debe ser un número entero. – gmuhammad

+2

@gmuhammad El método 'splice()' solo funciona en matrices, no en objetos. Deberá eliminar la propiedad utilizando 'delete asociativeArray ['key3']', por ejemplo. – GregL

+3

thg435: Probablemente haya causado un poco de confusión al usar la palabra 'matriz' en su nombre de variable. Quizás 'asociativeMap' podría haber sido mejor para dejar en claro que es un objeto, no una matriz? – GregL

2

Si no utiliza jQuery, que podría extender el prototipo del objeto hacer esto:

// 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; 
    } 
}); 

Usando esta manera en lugar de lo común Object.prototype.associativeIndexOf = ... trabajará con jQuery si lo usa.

Y entonces se podría utilizar de esta manera:

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

También se trabajará con matrices normales: [...], por lo que se podría utilizar en lugar de indexOf también.

Recuerde utilizar los operadores de triple carácter para comprobar si es indefinido:

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

Por supuesto que podría cambiar el nombre de la función si se prefiere, por ejemplo, keyOf, y recordar que no debe declarar cualquier variable llamado 'indefinido'.

Cuestiones relacionadas