DC.JS如何处理具有不同数量属性的对象

问题描述

比方说,我有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"
  }
]

所需的行为是将滤除没有属性的对象。像这样:

Text

这是一个小提琴: 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'))

Fork of your fiddle

请注意这一点,因为饼形图隐式地相加了100%,在这种情况下,它只相加了66%。对于用户而言,这可能会造成混淆,具体取决于使用方式。