请原谅长期问题。我只是不确定解决这个问题的最佳方法是什么。
我有一个电子表格(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解决方案,但如果需要,我可以处理库。谢谢!
答案 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