2012-05-10 2 views
5

Ho un array di oggetti come segue nel mio lato server JS:JavaScript - Contare i duplicati all'interno di un array di oggetti

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

ho bisogno di iterare attraverso questa struttura, rilevare eventuali duplicati e quindi creare un conteggio di un duplicato si trova accanto a ciascun valore.

Entrambi i valori devono corrispondere per qualificarsi come duplicato, ad es. "Società": "IBM" non è una corrispondenza per "Società": "MSFT".

Ho le opzioni di modificare la matrice di oggetti in entrata, se necessario. Vorrei che l'output fosse un oggetto, ma sto davvero lottando per farlo funzionare.

MODIFICA: ecco il codice che ho finora dove processArray è la matrice come elencato sopra.

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

possibile duplicato di [Rimuovi duplicati da una matrice di oggetti in javascript] (http://stackoverflow.com/questions/2218999/remove-duplicates-from-an-array-of-objects-in-javascript) –

+0

E ** perché ** dovrebbe qualcun altro fare questo lavoro per te? –

+0

@RoyiNamir: hahaha non sono io :) – Sarfraz

risposta

22

Ad esempio:

counter = {} 

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

Documenti: Array.forEach, JSON.stringify.

+0

Non credo ci sia una funzione 'forEach' sugli array. –

+7

@ElliotBonneville: ma tu credi in google, non lo sei – georg

+0

Wow, non posso credere di non aver mai sentito parlare di quella funzione! So cosa sto facendo invece di 8 zillion per loop, ora. Grazie! –

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