2016-04-20 8 views
0

Ich habe ein Array von Objekt wie folgt:Wie man JavaScript-Objekte nach Schlüssel zusammenführen?

[ { user: 'Abc', badge: [ 6 ] }, 
    { user: 'PQR', badge: [ 7 ] }, 
    { user: 'PQR', badge: [ 1 ] }, 
    { user: 'PQR', badge: [ 2 ] }, 
    { user: 'XYZ', badge: [ -5 ] } ] 

ich mit den folgenden JavaScript-Code, um dieses Objekt erstellt haben:

 for (var j = 0; j < aR.length; j++) 
    { 
     if (typeof aR[j] != 'undefined' && aR[j] != null) 
     { 

        recievedUser =aR[j].get("receiver").id; 
        badge = aR[j].get("rBTypes"); 

        if(recievedUser!= undefined && badge != undefined) 
        result.push({'user': recievedUser, 'badge': badge}); 
     } 
    } 

Jetzt möchte ich wie dieses Array fusionieren:

[  { user: 'Abc', badge: [ 6 ] }, 
     { user: 'PQR', badge: [ 7 ,1,2] }, 
     { user: 'XYZ', badge: [ -5 ] } ] 

Wie kann ich das tun?

Ich möchte auch den Benutzer mit den meisten Abzeichen finden?

+0

Tipp: es wird trivial, wenn Sie Ihre resu restrukturieren Zu '{Abc: [6], PQR: [7,1,2], ...}' – deceze

+0

Auch das ist ok für mich! – Akki

+1

'{user: 'PQR', badge: [7], [1], [2]}' ist kein gültiges Objektliteral –

Antwort

0

Sie können Array#forEach() mit thisArgs für ein temporäres Objekt als Verweis auf die gruppierten Elemente verwenden.

var data = [{ user: 'Abc', badge: [6] }, { user: 'PQR', badge: [7] }, { user: 'PQR', badge: [1] }, { user: 'PQR', badge: [2] }, { user: 'XYZ', badge: [-5] }], 
 
    grouped = [], 
 
    mostUser = []; 
 

 
data.forEach(function (a, i) { 
 
    if (!this[a.user]) { 
 
     this[a.user] = { user: a.user, badge: [] }; 
 
     grouped.push(this[a.user]); 
 
    } 
 
    this[a.user].badge = this[a.user].badge.concat(a.badge); 
 
    if (!i || this[a.user].badge.length > this[mostUser[0]].badge.length) { 
 
     mostUser = [a.user]; 
 
     return; 
 
    } 
 
    if (a.user !== mostUser[0] && this[a.user].badge.length === this[mostUser[0]].badge.length) { 
 
     mostUser.push(a.user); 
 
    } 
 
}, Object.create(null)); 
 

 
document.write('<pre>' + JSON.stringify(mostUser, 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');

0

Erstens, wenn Sie die trivialen umstrukturiert Ergebnisse erreichen wollen, die in den Kommentaren Ihrer Frage erwähnt deceze. Einfacher Wechsel der Push-Anweisung in Ihrem Code: result.push({recievedUser: badge});

nun zum Berechnen, welche Benutzer die meisten Abzeichen haben:

// Add these variables here 
var most_badges = 0; 
var user_with_most; 

for (var j = 0; j < attendeeReflections.length; j++) 
{ 
    if (typeof attendeeReflections[j] != 'undefined' && attendeeReflections[j] != null) 
    { 
     recievedUser =attendeeReflections[j].get("receiver").id; 
     badge = attendeeReflections[j].get("requestedBehaviorTypes"); 

     // Add this check here 
     if(badge.length > most_badges) { 
      most_badges = badge.length; 
      user_with_most = recievedUser; 
     } 
     // Now you have your results 

     if(recievedUser!= undefined && badge != undefined) 
      result.push({'user': recievedUser, 'badge': badge}); 
    } 
} 

Jetzt haben Sie den Benutzer mit den meisten gespeicherten Abzeichen in dem user_with_most Variable und die Menge an Badges, die der Benutzer in der Variablen most_badges gespeichert hat.

0

Sie entweder Ihre Funktion Überprüfung der Rückkehr Ergebnis vor in einem neuen Element schieben ändern können,

oder mit dem Ausgang haben Sie bereits Sie Array.reduce Array organisieren können,

hier eine Lösung mit reduzieren():

var a = [ { user: 'Abc', badge: [ 6 ] }, 
 
    { user: 'PQR', badge: [ 7 ] }, 
 
    { user: 'PQR', badge: [ 1 ] }, 
 
    { user: 'PQR', badge: [ 2 ] }, 
 
    { user: 'XYZ', badge: [ -5 ] } ] 
 

 

 
var r= a.reduce((ac,x) => { 
 
    (ac.some(z => { 
 
    if(z.user === x.user) 
 
     z.badge.push(x.badge[0]); 
 
     return (z.user === x.user);})) 
 
    || (ac.push(x)); 
 
    return ac; 
 
    
 
    },[]) 
 
console.log(r) 
 

Verwandte Themen