2016-04-12 10 views
0

長い質問をお許しください。私はこの問題に対する最良のアプローチが何であるか分かりません。共通のプロパティを持つ2つのオブジェクトを検索/マージする

私は郵送ラベルを作成する必要があるユーザーとアドレスのリストを含むスプレッドシート(​​Googleシート)を持っています。このスプレッドシートは、学生情報システムからのエクスポートです。アドレスは同じ家に住むユーザー間で共有されるようにサポートされていますが、データベースのエラーのために、アドレスを共有する必要があるユーザーの中には、同じアドレスの別々のインスタンスがあります。下記を参照してください(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 

この情報から「世帯」を作成する必要があります。私は、ソースデータ(ユーザーは共有アドレスの使い方を常に知っているとは限りません)で常に正しいと思うので、スクリプトを実行する前にスプレッドシートを操作する必要はありません。

が同じアドレスプロパティを持つオブジェクトが一致し、それらをマージし、オブジェクトを作成します。

はこれまでのところ、これは私が問題に近づいてきた方法です。

処理した後、私は以下のネストされたオブジェクトを持っている:

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

私は、2つのオブジェクト

//Result should be: 

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

をマージし、その "アドレス" の特性が等しいオブジェクトを見つけたいです私は、オブジェクトを作成する前にマッチング/マージを行うことを含む他の選択肢を公開しています。この情報を処理する方法がいくつかあるのでオブジェクトを使用しようとしています。プロジェクトを簡単に適用できるようにしたいのです。

また、これはGoogle Apps Scriptなので、私は純粋なjavascriptソリューションを希望しますが、必要に応じてライブラリを扱うことができます。ありがとう!

答えて

1

あなたが行が

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

エクセル

の行をマッピングするオブジェクトには、次の使用を開始し、確認し、削減し、マージを複製使用することもでき

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

重複マージするオブジェクトのハッシュマップの種類を維持した場合

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; 
}, {}) 

作業jsBin 0123を参照してください

+0

パーフェクト。 reduceを使ってオブジェクトを構築することは決して考えられませんでした。私は実際に質問のためにデータを簡素化したので、これを大幅に変更しなければなりませんでしたが、コンセプトはまさに私が必要としていました。 –

関連する問題