使用公共属性查找/合并两个对象

时间:2016-04-12 19:34:35

标签: javascript google-apps-script

请原谅长期问题。我只是不确定解决这个问题的最佳方法是什么。

我有一个电子表格(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

我需要根据这些信息创建“家庭”。我不能指望它始终在源数据中是正确的(用户并不总是知道如何使用共享地址),并且我不想在通过我的脚本运行之前操纵电子表格。 / p>

到目前为止,这就是我解决问题的方法:

创建对象,然后匹配具有相同地址属性的对象并合并它们。

处理完毕后,我有以下嵌套对象:

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

我想找到“地址”属性相等的对象,然后合并两个对象

//Result should be:

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

我对其他涉及在创建对象之前进行匹配/合并的替代方案持开放态度。我正在尝试使用对象,因为有几种不同的方法可以处理这些信息,我想让我的项目很容易适应。

另外,因为这是Google Apps脚本,我更喜欢纯粹的javascript解决方案,但如果需要,我可以处理库。谢谢!

1 个答案:

答案 0 :(得分:1)

如果您开始使用以下行对象映射excel的行

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

并维护一个hashMap类型的对象来检查和合并重复的

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

您可以使用reduce和duplicate merge来获取最终的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;
}, {})

参见工作jsBin here