首页 > 解决方案 > 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"
  }
]

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

这是一个小提琴: https ://jsfiddle.net/mj92shru/41/

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

将属性添加到第一个对象并添加像“none”这样的占位符值是可行的,但它并没有真正产生想要的行为。

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

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

标签: jsonobjectdc.js

解决方案


事实上,为您的维度或组键使用未定义的字段可能会使交叉过滤器崩溃,因为它不会验证其数据。NaN、null 和 undefined 没有明确定义的排序操作。

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

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

  middleNameDimension        = j.dimension(d => d.middleName || 'foo'),

我认为您确实想要过滤您的数据,但不是在交叉过滤器意义上,这些行被删除并且不影响其他图表。相反,它应该从组中删除而不影响其他任何内容。

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


推荐阅读