如何将过滤结果添加到 select 菜单

How to add filter result to select menu

我坚持使用 d3、dc 和 crossfilter 进行我的第一个仪表板项目。找不到解决方案。

"ETCBTC","BUY","0.002325","1.04","0.00241800","0.00104","ETC"
"ETCBTC","SELL","0.002358","1.04","0.00245232","0.00000245","BTC"
"LTCETH","SELL","0.30239","0.006","0.00181434","0.00000181","ETH"
"LTCETH","SELL","0.30239","0.149","0.04505611","0.00004506","ETH"

我在第一列中有不同的交易对,在这个例子中我只需要使用最后一对 BTC 和 ETH。

我找到了可以帮助我做到这一点的过滤器。

问题是我的 select 菜单中需要 BTC 和 ETH 才能应用过滤器。

function show_market_selector(ndx) {
    var marketDim = ndx.dimension(dc.pluck("Market"));
    var selectorMenu = marketDim.group();

    function filterItems(query) {
        return ndx.dimension(dc.pluck("Market")).filter(function(el) {
            return el.toLowerCase().indexOf(query.toLowerCase()) > 0;

        });
    }
    filterItems("BTC");
    var select = dc.selectMenu("#market-selector")
                    .dimension(marketDim)
                    .group(selectorMenu);

    select.title(function (d){
        return "BTC";
    });

}

现在我在这个菜单中得到了所有配对。但我的目标只是在 select 菜单中包含 BTC 和 ETH。

希望有人能给我建议。谢谢。

我认为只使用货币作为维度键会更容易:

var currencyDim = ndx.dimension(d => d.Market.slice(3)),
    currencyGroup = marketDim.group();
var select = dc.selectMenu("#market-selector")
                .dimension(currencyDim)
                .group(currencyGroup);

您真的不想在每次调用 filterItems 时都创建一个新维度 - 维度是旨在保留的重量级索引。

dimension.filter() 的名称令人困惑 - 它与 JavaScript 的 Array.prototype.filter() 完全不同,returns 匹配行。相反,它是一个命令式函数,它为该维度设置当前过滤器(并更改所有 other 维度看到的内容)。

如果您需要 "from currency" 维度,那就是

var fromCurrencyDim = ndx.dimension(d => d.Market.slice(0,3))