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

Crossfilter producing negative values with positive dataset when sorting data

我用错了 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"}];

我使用交叉过滤器 select 按属性

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

过滤某些属性时

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

终于找到问题了。

我正在对图表中的数据进行排序,以便按星期几的顺序显示。但是,这会以某种方式干扰 CrossFilter 的内部结构。

在图表中对数据进行排序之前对数据进行深度复制解决了问题(此处使用 JQuery)。

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