【问题标题】:dc.js add multiple filters at oncedc.js 一次添加多个过滤器
【发布时间】:2015-05-09 22:17:26
【问题描述】:

是否可以在 dc 图表上一次添加一组过滤器?例如,假设我有一个饼图和一组要应用的过滤器值。

var osChart = dc.pieChart('#oschart');

还有一组输入过滤器,比如说

var filters = ["linux", "mac osx", "windows", "solaris"]

如何应用过滤器以便只生成一个“过滤”事件? 我可以做类似的事情

for (var i=0; i < filters.length; i++) {
  osChart.filter(filters[i]);
}

但是,这会产生 4 个filtered 事件。 我正在根据用户在文本框中键入的内容应用过滤器。应用过滤器时,我会进行一些 ajax 调用,如果我一个一个地应用过滤器,这往往会减慢速度。如果可以一次设置过滤器,我可以避免额外的 ajax 调用。

crossfilter 有一个函数filterFunction 可以完成这项任务,但我不确定如何将它应用到 dc 图表上。在osChart.dimension() 上应用filterFunction 无效。在最新的 dc 版本中,我看到了一些功能,例如 addFilterHandlerremoveFilterHandler,但是我现在无法测试和部署该版本。

我还有什么其他选择?

【问题讨论】:

    标签: dc.js


    【解决方案1】:

    通过查看有些复杂的代码,您可以将数组在另一个数组中传递给.filter()(或未记录但不神奇的.replaceFilter())而不会降低性能,因为它将在调用 filtered 事件之前应用所有过滤器。

    来自最新的.filter() 源,它使用处理程序但具有相同的行为:

        if (_ instanceof Array && _[0] instanceof Array && !_.isFiltered) {
            _[0].forEach(function (d) {
                if (_chart.hasFilter(d)) {
                    _removeFilterHandler(_filters, d);
                } else {
                    _addFilterHandler(_filters, d);
                }
            });
        } else if (_ === null) {
            _filters = _resetFilterHandler(_filters);
        } else {
            if (_chart.hasFilter(_)) {
                _removeFilterHandler(_filters, _);
            } else {
                _addFilterHandler(_filters, _);
            }
        }
        applyFilters();
        _chart._invokeFilteredListener(_);
    

    因此,如果它找到一个没有isFiltered 方法的数组,并且该数组的第一个元素也是一个数组,它将遍历嵌套数组中的元素。

    例如,传递[["linux", "mac osx", "windows", "solaris"]] 以过滤这四个值。 (感谢@marcin 澄清!)

    【讨论】:

    • 啊,所以它需要是数组中的数组,例如.replaceFilter([["linux", "mac osx", "windows", "solaris"]])
    • 真的是@marcin吗?这很令人惊讶。您正在使用哪个图表?
    • 饼图。此答案 (if (_ instanceof Array &amp;&amp; _[0] instanceof Array &amp;&amp;) 中的第一行代码检查数组的第一个元素是否为数组。
    • 天哪,它比我想象的还要复杂。谢谢@marcin,我已经编辑了我的答案。
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2016-05-28
    • 2019-06-10
    相关资源
    最近更新 更多