2012-05-25 15 views
22

Encontré muchas preguntas relacionadas con respuestas que hablan sobre ... en loops y usando hasOwnProperty pero nada de lo que hago funciona correctamente. Todo lo que quiero hacer es verificar si existe una clave en una matriz y si no, agrégala.cómo evitar la adición de claves duplicadas a una matriz de javascript

Empiezo con una matriz vacía y agrego las teclas a medida que la página se elimina con jQuery.

Inicialmente, esperaba que algo tan simple como la siguiente funcionaría: (uso de nombres genéricos)

if (!array[key]) 
    array[key] = value; 

no ir. Siguió con:

for (var in array) { 
    if (!array.hasOwnProperty(var)) 
     array[key] = value; 
} 

También probamos:

if (array.hasOwnProperty(key) == false) 
    array[key] = value; 

Nada de esto ha funcionado. O bien no se envía nada a la matriz o lo que intento no es mejor que simplemente declarar array[key] = value ¿Por qué es algo tan simple tan difícil de hacer? ¿Alguna idea para hacer que esto funcione?

+3

¿Está intentando 'Array' o 'Object'? – thecodeparadox

+0

ES6 ahora tiene [Establecer] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) native – Efren

Respuesta

32

En términos generales, esto es mejor lograda con un objeto en lugar de JavaScript ya no tiene realmente matrices asociativas:

var foo = { bar: 0 }; 

A continuación, utilice in para comprobar si hay una clave:

if (!('bar' in foo)) { 
    foo['bar'] = 42; 
} 

Como era correctamente señalado en los comentarios a continuación, este método es útil solo cuando sus claves serán cadenas o elementos que pueden representarse como cadenas (como números).

+2

... suponiendo que sus valores son cadenas o representables como cadenas únicas (esto incluye números). – Phrogz

+0

@Phrogz Absolutamente. Un buen consejo para el OP. – Sampson

+3

Gracias Jonathan. La luz FINALMENTE hizo clic en lo que estaba haciendo mal. Estuve a punto de decir que tu respuesta tampoco ayudó, pero después de un poco más de trabajo de detective, me complace decir que funcionó a la perfección. Y gracias por los consejos sobre Objetos. Lo tendré en cuenta en el futuro. – iamsar

21
var a = [1,2,3], b = [4,1,5,2]; 

b.forEach(function(value){ 
    if (a.indexOf(value)==-1) a.push(value); 
}); 

console.log(a); 
// [1, 2, 3, 4, 5] 

Para más detalles leer sobre Array.indexOf.

Si quiere depender de jQuery, en lugar de utilizar jQuery.inArray:

$.each(b,function(value){ 
    if ($.inArray(value,a)==-1) a.push(value); 
}); 

Si todos los valores son simple y única que puede representarse como cadenas, sin embargo, se debe utilizar un objeto en lugar de una matriz, para un aumento de velocidad potencialmente masivo (como se describe en la respuesta de @JonathanSampson).

+0

Además, el problema con el uso de 'indexOf' es que crea un bucle ... Esto hace que [un algoritmo de Schlemiel el pintor] (http://en.wikichip.org/wiki/Schlemiel_the_Painter's_Algorithm) se ralentice con cada elemento agregado a la matriz. –

0

La lógica es incorrecta. Considere esto:

x = ["a","b","c"] 
x[0]  // "a" 
x["0"] // "a" 
0 in x // true 
"0" in x // true 
x.hasOwnProperty(0) // true 
x.hasOwnProperty("0") // true 

No hay razón para bucle para comprobar si hay clave (o índices de arrays) la existencia. Ahora, valores son una historia diferente ...

feliz de codificación

0
function check (list){ 
    var foundRepeatingValue = false; 
    var newList = []; 
    for(i=0;i<list.length;i++){ 
     var thisValue = list[i]; 
     if(i>0){ 
      if(newList.indexOf(thisValue)>-1){ 
       foundRepeatingValue = true; 
       console.log("getting repeated"); 
       return true; 
      } 
     } newList.push(thisValue); 
    } return false; 
} 

 

var list1 = ["dse","dfg","dse"]; 
check(list1); 

Salida:

getting repeated 
true 
Cuestiones relacionadas