2016-04-12 11 views
0

Bitte entschuldigen Sie die lange Frage. Ich bin mir nicht sicher, was der beste Ansatz für dieses Problem ist.Finden/Zusammenführen von zwei Objekten mit einer gemeinsamen Eigenschaft

Ich habe eine Tabelle (Google Sheet) mit einer Liste von Benutzern und Adressen, aus denen ich Adressetiketten erstellen muss. Diese Tabelle ist ein Export aus unserem Schülerinformationssystem. Die Adressen werden zwischen Benutzern ausgetauscht, die im gleichen Haus leben, aber aufgrund von Fehlern in unserer Datenbank haben einige Benutzer, die eine Adresse teilen, separate Instanzen derselben Adresse. Siehe unten (dargestellt als CSV):

Address ID,Address,User 
----------------------- 
100,Boston,Bob 
100,Boston,Joan  //Note, same address ID AND address -this is correct 
200,Boston,Geoff  //DIFFERENT address ID and address -wrong 
300,New York,Steve //Just here for contrast 

Ich muss aus diesen Informationen "Haushalte" erstellen. Ich kann nicht darauf zählen, dass die Quelldaten immer korrekt sind (die Benutzer wissen nicht immer, wie sie gemeinsame Adressen verwenden), und ich möchte die Tabelle nicht bearbeiten müssen, bevor ich sie durch mein Skript laufe.

Bisher ist dies, wie ich das Problem angesprochen haben:

Objekte erstellen, dann Objekte übereinstimmen mit derselben Adresse Eigentum und sie verschmelzen.

Nach der Bearbeitung habe ich folgende verschachtelte Objekte:

var masterObj = { 
    100: {"address": "Boston", 
     "users": ["Bob","Joan"] 
    }, 
    200: {"address": "Boston", 
     "users": ["Geoff"] 
    }, 
    300: {"address": "New York", 
     "users": ["Steve"] 
    } 
} 

Ich möchte Objekte zu finden, deren "Adresse" Eigenschaften gleich sind, dann verschmelzen die beiden Objekte

//Result should be: 

var masterObj = { 
    100: {"address": "Boston", 
     "users": ["Bob","Joan","Geoff"], 
    300: {"address": "New York", 
     "users": ["Steve"] 
    } 
} 

Ich bin offen für andere Alternativen, die das Zusammenführen/Zusammenführen VOR dem Erstellen von Objekten beinhalten. Ich versuche, Objekte zu verwenden, da es verschiedene Möglichkeiten gibt, wie diese Informationen gehandhabt werden können, und ich möchte, dass mein Projekt leicht anpassbar ist.

Auch, weil dies Google Apps Script ist, würde ich eine reine Javascript-Lösung bevorzugen, aber ich kann mit Bibliotheken umgehen, wenn nötig. Vielen Dank!

Antwort

1

Wenn Sie begann mit folgenden Zeilen die Zeilen von Excel-Objekt-Mapping

var rows = 
[ 
    {addressId:100,address:'Boston',user:'Bob'}, 
    {addressId:100,address:'Boston',user:'Joan'}, 
    {addressId:200,address:'Boston',user:'Geoff'}, 
    {addressId:300,address:'New York',user:'Steve'} 
]; 

und eine HashMap Art von Objekt beibehalten zu überprüfen und doppelte fusionieren

var addressMap = {}; //{key: address, value: addressId} 

Sie reduzieren und merge duplizieren verwendet haben könnte Arbeits jsBinerhalten Ihre endgültige masterObj

var masterObj = rows.reduce(function(previous, next){ 
    if(addressMap[next.address]){ 
     previous[addressMap[next.address]].users.push(next.user); 
    } else { 
     previous[next.addressId] = {address: next.address, users: [next.user]}; 
     addressMap[next.address] = next.addressId; 
    } 
    return previous; 
}, {}) 

anzeigen

+0

Perfekt. Nie daran gedacht, mit reduce ein Objekt zu bauen. Ich habe meine Daten für die Frage vereinfacht, also musste ich das deutlich anpassen, aber das Konzept ist genau das, was ich brauchte. –

Verwandte Themen