我正在尝试为数据集属性组创建自定义reduce函数,该函数将为另一个属性求和一些唯一值.
例如,我的数据集看起来像团队成员对项目的操作列表:
{ project:"Website Hosting", teamMember:"Sam", action:"email" },
{ project:"Website Hosting", teamMember:"Sam", action:"phoneCall" },
{ project:"Budjet", teamMember:"Joe", action:"email" },
{ project:"Website Design", teamMember:"Joe", action:"design" },
{ project:"Budget", teamMember:"Sam", action:"email" }
Run Code Online (Sandbox Code Playgroud)
因此,团队成员通过每行执行一个操作来处理可变数量的项目.我有团队成员的维度,并希望通过项目数量(独特)来减少它.
我尝试了以下(在uniques数组中存储项目)没有成功(抱歉,这可能会伤到你的眼睛):
var teamMemberDimension = dataset.dimension(function(d) {
return d.teamMember;
});
var teamMemberDimensionGroup = teamMemberDimension.group().reduce(
// add
function(p,v) {
if( p.projects.indexOf(v.project) == -1 ) {
p.projects.push(v.project);
p.projectsCount += 1;
}
return p;
},
// remove
function(p,v) {
if( p.projects.indexOf(v.projects) != -1 ) {
p.projects.splice(p.projects.indexOf(v.projects), 1);
p.projectsCount -= 1;
}
return p;
},
// init
function(p,v) {
return { projects:[], projectsCount:0 }
}
);
Run Code Online (Sandbox Code Playgroud)
非常感谢!
在DJ Martin的回答后编辑::
所以,为了更清楚,我想得到我在这里的数字将是:
-----------
Sam : 2 (projects he is workin on, no matter the number of actions)
Joe : 2 (projects he is workin on, no matter the number of actions)
-----------
Run Code Online (Sandbox Code Playgroud)
DJ Martin提供的答案让我在那里.但我想找到一种方法将这些数字用于我的DC.JS条形图,而不是对表格进行硬编码.当我只使用动作的数量(所以只是一个reduceCount()),我就像下面这样做:
teamMemberChart.width(270)
.height(220)
.margins({top: 5, left: 10, right: 10, bottom: 20})
.dimension(teamMemberDimension)
.group(teamMemberDimensionGroup)
.colors(d3.scale.category20())
.elasticX(true)
.xAxis().ticks(4);
Run Code Online (Sandbox Code Playgroud)
我想组中可能会有一些变化().
DJ *_*tin 15
更新的答案
对不起,我误解了这个问题......你实际上是在正确的轨道上.您只需要维护每个项目的计数,以便减法函数可以知道何时删除该值.
teamMemberGroup = teamMemberDimension.group().reduce(
function (p, d) {
if( d.project in p.projects)
p.projects[d.project]++;
else p.projects[d.project] = 1;
return p;
},
function (p, d) {
p.projects[d.project]--;
if(p.projects[d.project] === 0)
delete p.projects[d.project];
return p;
},
function () {
return {projects: {}};
});
Run Code Online (Sandbox Code Playgroud)
这是一个更新的小提琴:http://jsfiddle.net/djmartin_umich/3LyhL/