首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多个数据源导致“无效数组宽度!”错误

多个数据源导致“无效数组宽度!”错误
EN

Stack Overflow用户
提问于 2014-03-14 09:35:46
回答 2查看 643关注 0票数 1

我通过执行循环的ajax调用将记录加载到交叉筛选器对象中:

代码语言:javascript
代码运行次数:0
运行
复制
    for (i=0;i<rangeToLoad.length;i++) {

    url = "http://myserver/"+rangeToLoad[i]+"/myrecords.js"

    $.ajax({
        url: url,
        dataType:"json",
        success: function (jsondata) {

            var records = jsondata.records;
            var parseDate = d3.time.format("%Y-%m-%d").parse;

            records.forEach(function(d) {
                d.date = parseDate(d.date);
            });

            if (typeof myCrossfilter === "undefined") { //first call
                myCrossfilter = crossfilter(records);
            } else {
                myCrossfilter.add(records);
            }

            initData();
            showData();
        }
    });
}

我的initData()函数基本上是定义交叉过滤器对象的维度和组的地方。

代码语言:javascript
代码运行次数:0
运行
复制
dims.date = myCrossfilter.dimension(function(d) {return(+d.date);});
groups.date={};
dims.date2 = myCrossfilter.dimension(function(d) {return(+d.date);});
groups.date2={};
dims.instrumenttype = myCrossfilter.dimension(function(d) {return(d.product);});
groups.instrumenttype = {};
groups.date.pnlSum = dims.date.group().reduceSum(function(d) {return(d.pnl);});
groups.date2.cumPnlSum = dims.date2.group().reduceSum(function(d) {return(d.cumpnl);});
groups.instrumenttype.pnlSum = dims.instrumenttype.group().reduceSum(function(d) {return(d.pnl);});

我的猜测是,每次创建一个新维度,而不是更新每个ajax调用的现有维度。

我怎样才能防止这种情况发生呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-19 08:54:25

诀窍是,只在ajax调用的第一次传递时才创建维度,方法是检查是否定义了交叉筛选器。我还取消了ajax调用的异步属性,因为在我的示例中它不是一个大问题(数据加载非常快)。它防止了找出哪个呼叫是先做的令人头痛的任务。

代码语言:javascript
代码运行次数:0
运行
复制
for (i=0;i<rangeToLoad.length;i++) {

url = "http://myserver/"+rangeToLoad[i]+"/myrecords.js"

$.ajax({
    url: url,
    dataType:"json",
    async:false,
    success: function (jsondata) {


        if (typeof myCrossfilter === "undefined") { //first call
            myCrossfilter = crossfilter(records);
            initData()
        } else {
            myCrossfilter.add(records);
        }

        showData();
    }
});

}

票数 0
EN

Stack Overflow用户

发布于 2014-03-18 16:18:51

交叉过滤器只支持最大32维。您可以通过使用dimension.dispose函数来管理维度的数量,这样既可以在完成维度时(在showData之后),也可以在新维度出现之前(在initData之前)。

正如接受的答案所说明的那样,Crossfilter还支持添加新行。在内部,Crossfilter管理一组侦听器,在添加或删除数据时通知内部维度和分组结构。因此,正确的做法是确保只创建一次维度,然后在随后的传递中根据需要更改数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22401085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档