问题描述
比方说,我有2个对象,每个对象都具有相同的属性,但一个对象具有额外的属性middleName,而另一个对象则没有。 我应该如何在DC.js中处理此问题?
var objects = [{
name: "De Smet",firstName: "Jasper",adress: "Borsbeke",},{
name: "De Backer",firstName: "Dieter",middleName: "middleName",adress: "Borsbeke"
},{
name: "De Bondtr",firstName: "Simon",middleName: "OtherMiddleName",adress: "Denderleeuw"
}
]
所需的行为是将滤除没有属性的对象。像这样:
这是一个小提琴: https://jsfiddle.net/mj92shru/41/
似乎将属性Middlename添加到第一个对象,并为其分配找到的下一个Middlename
将属性添加到第一个对象并添加一个占位符值(如“ none”)是可行的,但实际上并不会产生所需的行为。
我意识到我可以过滤掉中间名设置为“ none”的对象,但这在我正在编写的实际应用程序中会很困难
解决方法
实际上,crash crossfilter可以为维度或组键使用未定义的字段,因为它不验证其数据。 NaN,null和undefined没有明确定义的排序操作。
看到值折叠到另一个容器中很奇怪,但是我怀疑它是相同的未定义行为,而不是您可以依赖的行为。
如果您的字段可能未定义,则即使不希望使用该值,也应始终将其默认设置:
middleNameDimension = j.dimension(d => d.middleName || 'foo'),
我认为您确实想过滤数据,但是从交叉过滤器的意义上讲,这些行被删除并且不会影响其他图表。相反,应该将其从组中删除,而不会影响其他任何内容。
您可以为此使用“伪造的组”,其中有one in the FAQ非常适合您的问题:
function remove_bins(source_group) { // (source_group,bins...}
var bins = Array.prototype.slice.call(arguments,1);
return {
all:function () {
return source_group.all().filter(function(d) {
return bins.indexOf(d.key) === -1;
});
}
};
}
像这样应用它:
.group(remove_bins(middleNameGroup,'foo'))
请注意这一点,因为饼形图隐式地相加了100%,在这种情况下,它只相加了66%。对于用户而言,这可能会造成混淆,具体取决于使用方式。