一种使用 javascript 为活动源聚合和分组项目的方法
Posted
技术标签:
【中文标题】一种使用 javascript 为活动源聚合和分组项目的方法【英文标题】:A way to aggregate and group items for an activity feed using javascript 【发布时间】:2012-06-11 11:14:48 【问题描述】:我有一个活动流项目列表,我希望将相似的项目组合在一起。例如,不应有 4 个条目说“Joe 喜欢你的快乐帖子”、“Sarah 喜欢你的快乐帖子”、“Bob 喜欢你的快乐帖子”、“Tom 喜欢你的快乐帖子”,而应该有一个说“Joe 、Sarah 和另外 2 人点赞了您的快乐帖子”。当项目被聚合时,聚合后的帖子将使用其部分的最新时间戳。
活动流不是无穷无尽的,仅包含过去一周的项目,因此所有符合名词(noun.activityType + noun.id)和动词属性的项目都应分组在一起。每个活动项目都有一个演员(谁做的)、目标(将它发布到谁的提要)、动词(演员做了什么)和名词(动词作用于什么对象)。
我已经把这个测试数据集放在了 jsfiddle 上供你们玩:
http://jsfiddle.net/yu2P8/1/
"pts": 0,
"verb": "follow",
"target": "mike",
"actor": "test01",
"title": "test01 has started following you",
"published": "2012-06-04T22:34:01.914Z",
"_id": "4fcd37d9c7f1f40100000d7d",
"noun":
"id": "mike",
"activityType": "profile",
"title": null
一种策略是在创建活动项时聚合服务器端,但我想探索在客户端使用下划线之类的库来执行此操作,看看它是否可行。
【问题讨论】:
Monkey Bonkey,你是如何生成 JSON 的?来自数据库中的表? 两种方式,一种来自数据库查询,另一种来自日志的批处理流。 你能分享一个 DB Schema 的例子,它会在这里产生类似你的输出吗?例如,名词是自己的表吗?我已经生成了 JSON 输出,但从来没有这样?我一直无法在互联网上找到答案。 我使用的是文档数据库 (mongo),所以它是无模式的。每个对象都大致遵循活动流规范。 我将创建一个活动表,其中包含所有活动流属性(例如名词、动词、目标等)的列。 【参考方案1】:所以我使用下划线组和地图解决了这个问题。我首先使用名词和动词作为键来使用下划线组。然后我使用下划线reduce函数将结果合并到一个条目中。
var groupedResults = _.groupBy(data, function(val)
return val.noun.id + val.noun.activityType + val.verb;
);
function reducer(activities, key)
var reduction = _.reduce(activities, function(a, b)
if (a && a.actors && !_.include(a.actors, b.actor))
a.actors.push(b.actor);
else
a.actors = [b.actor];
a.published = a.published < b.published ? b.published : a.published;
return a;
, activities[0]);
reduction.pronoun = getActorsSummaryString(reduction);
reduction.title = summarizeTitle(reduction);
return reduction;
finalResults = sortByRecent(_.map(groupedResults, reducer));
【讨论】:
以上是关于一种使用 javascript 为活动源聚合和分组项目的方法的主要内容,如果未能解决你的问题,请参考以下文章
如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用agg函数计算每个分组不同数值变量的聚合统计值agg参数为字典指定不同变量的聚合计算统计量的形式