2012-05-10 14 views
5

Tengo una matriz de objetos de la siguiente manera dentro de mi lado del servidor JS:JavaScript - Count duplicados dentro de una matriz de objetos

[ 
    { 
     "Company": "IBM" 
    }, 
    { 
     "Person": "ACORD LOMA" 
    }, 
    { 
     "Company": "IBM" 
    }, 
    { 
     "Company": "MSFT" 
    }, 
    { 
     "Place": "New York" 
    } 
] 

necesito iterar a través de esta estructura, detectar duplicados y luego crear una cuenta de un duplicado se encuentra junto a cada valor.

Ambos valores deben coincidir para calificar como un duplicado, p. Ej. "Empresa": "IBM" no concuerda con "Compañía": "MSFT".

Tengo la opción de cambiar la matriz de entrada de objetos si es necesario. Me gustaría que la salida sea un objeto, pero realmente estoy luchando para que esto funcione.

EDITAR: Aquí está el código que tengo hasta ahora donde processArray es la matriz como se indica más arriba.

var returnObj = {}; 

    for(var x=0; x < processArray.length; x++){ 

     //Check if we already have the array item as a key in the return obj 
     returnObj[processArray[x]] = returnObj[processArray[x]] || processArray[x].toString(); 

     // Setup the count field 
     returnObj[processArray[x]].count = returnObj[processArray[x]].count || 1; 

     // Increment the count 
     returnObj[processArray[x]].count = returnObj[processArray[x]].count + 1; 

    } 
    console.log('====================' + JSON.stringify(returnObj)); 
+1

posible duplicado de [Eliminar duplicados de una matriz de objetos en javascript] (http://stackoverflow.com/questions/2218999/remove-duplicates-from-an-array-of-objects-in-javascript) –

+0

Y ** ¿por qué ** debería alguien más hacer este trabajo por usted? –

+0

@RoyiNamir: jajaja no soy yo :) – Sarfraz

Respuesta

22

Por ejemplo:

counter = {} 

yourArray.forEach(function(obj) { 
    var key = JSON.stringify(obj) 
    counter[key] = (counter[key] || 0) + 1 
}) 

Docs: Array.forEach, JSON.stringify.

+0

No creo que haya una función 'forEach' en las matrices. –

+7

@ElliotBonneville: pero cree en Google, ¿no es así? – georg

+0

¡Guau, no puedo creer que nunca haya escuchado sobre esa función! Sé lo que estoy haciendo en lugar de 8 trillones de bucles, ahora. ¡Gracias! –

1
Object.prototype.equals = function(o){ 
    for(var key in o) 
     if(o.hasOwnProperty(key) && this.hasOwnProperty(key)) 
      if(this[key] != o[key]) 
       return false; 
    return true; 
} 
var array = [/*initial array*/], 
    newArray = [], 
    ok = true; 
for(var i=0,l=array.length-1;i<l;i++) 
    for(var j=i;j<l+1;j++) 
    { 
     if(!array[i].equals(array[j])) 
      newArray.push(array[i]); 
    } 
Cuestiones relacionadas