在对数据进行排序时,Crossfilter会使用正数据集生成负值

时间:2018-04-04 13:14:13

标签: javascript d3.js crossfilter c3.js

我使用的是crossfilter错误但无法找到哪里。

我有一个我正在过滤的数据集。当我提供排序功能按星期几对数据进行排序时,结果显示负值。

如果我跳过排序,一切正常。

数据看起来像这样

  dataEg=[{"attr1": "A", "date":" Thu Apr 12 2018 00:00:00 GMT+0100 (BST)", "attr2": "a", "attr3": 25.11, "dayOfWeek": "Thu"},
  {"attr1": "B", "date":" Sun Apr 01 2018 00:00:00 GMT+0100 (BST)", "attr2": "b", "attr3": 6.67, "dayOfWeek": "Sun"}];

我使用crossfilter按属性选择

var crossFilter = (function () {
        var filter = {};
        filter.ndx = crossfilter(dataEg);

        filter.attr2Dim = filter.ndx.dimension(function (d) { return d.attr2; });
        filter.dayOfWeekDim = filter.ndx.dimension(function (d) { return d.dayOfWeek; });
        filter.attr1Dim = filter.ndx.dimension(function (d) { return d.attr1; });

        filter.costPerDayOfWeek = filter.dayOfWeekDim.group().reduceSum(function (d) { return d.attr3; });
        filter.costPerattr2 = filter.attr2Dim.group().reduceSum(function (d) { return d.attr3 });
        filter.costPerattr1 = filter.attr1Dim.group().reduceSum(function (d) { return d.attr3 });

        return filter;
    })();

过滤某些atteribute

crossFilter.attr1Dim.filter(function (d) {
                        return d === "B";
                    });

除非我先使用此过滤器按日排序日期

,否则一切正常
function DaySorter (keyLocator) {
        if (keyLocator === undefined) {
            keyLocator = function (item) {
                return item;
            };
        }

        return function (a, b) {
            var order = {
                "Mon": 0, "Tue": 1, "Wed": 2, "Thu": 3, "Fri": 4, "Sat": 5, "Sun": 6
            };

            var aVal = order[keyLocator(a)];
            var bVal = order[keyLocator(b)];

            var comp = 0;
            if (aVal > bVal) {
                comp = 1;
            }
            else if (aVal < bVal) {
                comp = -1;
            }
            return comp;
        };
    }

然而,我没有看到我犯错的地方。过滤器似乎正常工作并遵循documentation

可以找到最小的JSFiddle here

1 个答案:

答案 0 :(得分:0)

终于找到了问题。

我正在对图表中的数据进行排序,以便按星期几的顺序显示。然而,这在某种程度上干扰了CrossFilter的内部。

在对图表进行排序之前对数据进行深层复制解决了问题(这里使用JQuery)。

           data =[];
           $.extend(true, data, dataOrg);