2012-05-10 3 views
5

У меня есть массив объектов следующим образом в моей стороне сервера JS:JavaScript - граф дубликатов в массиве объектов

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

Мне нужно перебирать эту структуру, выявление дубликатов, а затем создать счетчик рядом с каждым значением находится дубликат.

Оба значения должны совпадать, чтобы квалифицироваться как дубликат, например. «Компания»: «IBM» не подходит для «Компании»: «MSFT».

У меня есть варианты изменения входящего массива объектов, если это необходимо. Я хотел бы, чтобы результат был объектом, но я действительно пытаюсь заставить его работать.

EDIT: Вот код, который у меня есть до сих пор, где processArray - это массив, как указано выше.

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

Возможный дубликат [Удалить дубликаты из массива объектов в javascript] (http://stackoverflow.com/questions/2218999/remove-duplicates-from-an-array-of-objects-in-javascript) –

+0

И ** почему ** должен ли кто-то другой делать эту работу за вас? –

+0

@RoyiNamir: hahaha это не я :) – Sarfraz

ответ

22

Например:

counter = {} 

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

Документы: Array.forEach, JSON.stringify.

+0

Я не верю, что на массивах есть функция 'forEach'. –

+7

@ElliotBonneville: но вы действительно верите в google, не так ли? – georg

+0

Вау, я не могу поверить, что никогда не слышал об этой функции! Теперь я знаю, что я делаю вместо 8-миллионных циклов. Благодаря! –

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]); 
    } 
Смежные вопросы