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

DC.JS How to handle objects with different amount of properties

假设我有 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"
  }
]

想要的行为是过滤掉没有 属性 的对象。像这样:

这是一个fiddle: https://jsfiddle.net/mj92shru/41/

似乎将 属性 中间名添加到第一个对象并为其分配它找到的下一个中间名

将 属性 添加到第一个对象并添加占位符值(如“none”)有效,但它并没有真正产生所需的行为。

我知道我可以过滤掉中间名设置为“none”的对象,但在我编写的实际应用程序中这会很困难

我还发现添加没有 属性 最后一个对象会导致它崩溃。

事实上,为您的维度或组键使用未定义的字段可以 crash crossfilter 因为它不会验证其数据。 NaN、null 和 undefined 没有 well-defined 排序操作。

看到值被折叠到另一个容器中很奇怪,但我怀疑它是相同的未定义行为,而不是您可以依赖的东西。

如果您有可能未定义的字段,您应该始终将它们设置为默认值,即使您不想要该值:

  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%。这可能会让用户感到困惑,具体取决于它的使用方式。