Crossfilter 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" }

因此,团队成员通过每行执行一个操作来处​​理可变数量的项目。 我有团队成员的维度,并希望通过项目数量(独特)来减少它。

我尝试了下面的(将项目存储在唯一数组中),但没有成功(对不起,这可能会伤害你的眼睛):

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 }
            }
        );

非常感谢!

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)
-----------

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);

我想组中可能会有一些变化()。


更新的答案

对不起,我误解了这个问题......你实际上是在正确的轨道上。 您只需要维护每个项目的计数,以便您的减法函数可以知道何时删除该值。

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: {}};
        });

这是一个更新的小提琴:http://jsfiddle.net/djmartin_umich/3LyhL/

链接地址: http://www.djcxy.com/p/32791.html

上一篇: Crossfilter reduce :: find number of uniques

下一篇: How Do I Backup Azure Tables and Blobs