对数据进行排序时,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);
我用错了 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);