循环遍历一个集合并返回一个新集合,其中组合了具有相同id的对象
Loop through a collection and return a new collection where objects with the same id are combined
假设我有一个javascript数组
var events = [
{id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
{id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Ted', 'Laura']},
{id: 5, name: 'Football Game', invitees: ['Jim', 'Samantha']},
];
我需要的是将这个数组缩减成这样:
var events = [
{id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
{id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Gary', 'Jane', 'Ted', 'Laura', 'Jim', 'Samantha']}
];
数组被简化为每个id只有一个对象,并且每个对象中的受邀者数组显示所有受邀者。
在这里我很难开始基本的逻辑。
您可以对reduce()
和forEach()
这样做。
var events = [
{id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
{id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Ted', 'Gary', 'Laura']},
{id: 5, name: 'Football Game', invitees: ['Jim', 'Samantha']}
];
var o = {}
var result = events.reduce(function(r, e) {
if (!o[e.id]) {
o[e.id] = e;
r.push(o[e.id]);
} else {
e.invitees.forEach(function(a) {
if (o[e.id].invitees.indexOf(a) == -1) o[e.id].invitees.push(a);
})
}
return r;
}, [])
console.log(result)
您也可以使用Set
代替forEach()
循环来删除重复项。
var events = [
{id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
{id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Ted', 'Gary', 'Laura']},
{id: 5, name: 'Football Game', invitees: ['Jim', 'Samantha']}
];
var o = {}
var result = events.reduce(function(r, e) {
if (!o[e.id]) {
o[e.id] = e;
r.push(o[e.id]);
} else {
o[e.id].invitees = [...new Set(o[e.id].invitees.concat(e.invitees))];
}
return r;
}, [])
console.log(result)
您可以使用以下ES6 函数式编程样式的代码:
var result = Array.from (
events.reduce ( (acc, obj) => acc.set(obj.id,
Object.assign({}, obj, {invitees: [...new Set(
[...(acc.get(obj.id) || obj).invitees, ...obj.invitees] )]})
), new Map() ), ([id, obj]) => obj );
var events = [
{id: 1, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 2, name: 'Football Game', invitees: ['Gary', 'Jane','Bella']},
{id: 3, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 4, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Gary', 'Jane']},
{id: 5, name: 'Football Game', invitees: ['Ted', 'Laura']},
{id: 5, name: 'Football Game', invitees: ['Jim', 'Samantha']},
];
var result = Array.from (
events.reduce ( (acc, obj) => acc.set(obj.id,
Object.assign({}, obj, {invitees: [...new Set(
[...(acc.get(obj.id) || obj).invitees, ...obj.invitees] )]})
), new Map() ), ([id, obj]) => obj );
console.log(result);
相关文章:
- 包含一个集合的1到3个成员但其中一个成员不能单独存在的正则表达式
- 如何将两个集合转换为一个集合
- Meteor:访问另一个集合,每个块中有一个id
- Backbone.js视图可以有一个模型和一个集合吗
- 另一个集合视图中的集合视图
- Mongo-Aggregate:如何与另一个集合中的字段进行比较
- Meteor - 将 mongodb 查询分配给变量并将其插入到另一个集合
- 基于 MongoDB 中另一个集合中的数据查询一个集合中的数据
- 流星 - 将数据从一个集合移动到另一个集合
- 一个集合中的不同模型类型 主干
- 如何在插入时引用另一个集合
- 主干:将模型从一个集合添加到另一个集合
- 用于将树分支从集合移动到另一个集合的Firebase API
- WinstonMongoDB:如何将日志管道传输到多个集合,而不是全部传输到一个集合
- 如何仅从一个集合中删除主干模型
- MongoDB:从一个集合中提取多个随机文档
- 在Meteor(MongoDB)中,按另一个集合中的值搜索一个集合
- MongoDB-插入到两个集合中,一个集合引用另一个作为子文档
- Meteor从数组返回值,以便在另一个集合中使用它
- 只有当一个新元素被添加到一个集合中时,才使用$inc