无效的数组宽度而未声明新维度

时间:2017-05-26 10:35:24

标签: dc.js crossfilter

我的网络应用在Crossfilter.js v1.3.12第462行生成“无效数组宽度”错误。这个错误似乎告诉我,我有> 32维度。问题在于,当错误发生时,我并没有故意声明新的维度。

我有10个滑块,在我的数据集上充当数字滤镜。在第二个滑动条上的拖动事件结束时,如果numericDims数组中的第二个位置上不存在任何维,则声明一个维。 (编辑:即使我事先声明了所有10个维度,并删除了动态声明,问题仍然存在。)应用程序中已经存在大约10个维度用于其他图形&过滤器。

第一次移动滑块手柄时,会记录“新尺寸”。之后,每次在同一个滑块上移动手柄时,都不会记录“新尺寸”。这是预期的行为。但是,如果我移动句柄足够多次,我会得到“无效的数组宽度”错误。所以,我想每次搬家时都必须意外地宣布一个新的尺寸。任何人都可以看到我是如何无意中宣布一个新的维度?最相关的代码:

  if (!numericDims[tempIndex]) {
    console.log('new dimension');
    numericDims[tempIndex] = facts.dimension(function(p){ return p[d]; }); 
  }


  if (flag==0) {
    prt.classed("activeFilter",true);
    numericDims[tempIndex].filterFunction(function(p){ return p>=min && p<=max; });

  } else {
    prt.classed("activeFilter",false);
    numericDims[tempIndex].filterAll();
    // numericDims[tempIndex].dispose(); ***I figure it's quicker to store them instead of disposing/deleting. Even when I dispose/delete, the problem still happens.
    // delete numericDims[tempIndex];
    // numericDims.splice(tempIndex,1);
    prt.selectAll("g.handle.left").attr("title",null);
    prt.selectAll("g.handle.right").attr("title",null);
  }
  console.log(numericDims);

全功能:

function dragended(d) {

    let transformation = {
        Y: Math.pow(10, 24),
        Z: Math.pow(10, 21),
        E: Math.pow(10, 18),
        P: Math.pow(10, 15),
        T: Math.pow(10, 12),
        G: Math.pow(10, 9),
        M: Math.pow(10, 6),
        k: Math.pow(10, 3),
        h: Math.pow(10, 2),
        da: Math.pow(10, 1),
        d: Math.pow(10, -1),
        c: Math.pow(10, -2),
        m: Math.pow(10, -3),
        μ: Math.pow(10, -6),
        n: Math.pow(10, -9),
        p: Math.pow(10, -12),
        f: Math.pow(10, -15),
        a: Math.pow(10, -18),
        z: Math.pow(10, -21),
        y: Math.pow(10, -24)
    }

    let reverse = s => {
        let returnValue;
        Object.keys(transformation).some(k => {
            if (s.indexOf(k) > 0) {
                returnValue = parseFloat(s.split(k)[0]) * transformation[k];
                return true;
            }
        })
        return returnValue;
    }


  var facts = window.facts;
  if (d3.select(this).attr("class").indexOf("left")==-1) { var otherHandle = 'left'; } else { var otherHandle = 'right'; }
  d3.select(this).classed("dragging",false);

  var filterFields = window.filterFields;
  var tempIndex = filterFields[0].indexOf(d);
  var min = filterFields[2][tempIndex];
  var max = filterFields[3][tempIndex];
  //console.log(min+', '+max);
  var scale = filterFields[4][tempIndex];
  var t = d3.transform(d3.select(this).attr("transform"));
  var thisX = t.translate[0];
  var flag=0;
  var prt = d3.select("g#f_"+tempIndex);
  var leftHandleX = d3.transform(prt.selectAll("g.handle.left").attr("transform")).translate[0];
  var rightHandleX = d3.transform(prt.selectAll("g.handle.right").attr("transform")).translate[0];

  var wid = prt.selectAll("g.axis").select("rect.numFilterBox").attr("width");
  prt.selectAll("g.axis").select("rect.numFilterBox").attr("x",leftHandleX).attr("width",rightHandleX - leftHandleX);

  var num = -1;
  var pFlag = 0;
  if (filterFields[3][tempIndex]<=1) { var fmt = d3.format('%'); pFlag=1; } else { var fmt = d3.format('4.3s'); }


  if (otherHandle=='left') {
    if (thisX>=300 && scale(min)==0) { flag=1; }
    max = scale.invert(thisX);
    if (isNaN(+fmt(max).trim())) {
      if (pFlag==1) {
        max = +fmt(max).substr(0,fmt(max).length-1)/100
      } else {
        max = reverse(fmt(max));
      }
    } else {
      max = +fmt(max).trim();
    }
    prt.selectAll("g.handle.right").attr("title",function(d){ return 'The filtered maximum for '+filterFields[1][tempIndex]+' is '+max; });

  } else {
    if (thisX<=0 && scale(max)==300) { flag=1; }
    min = scale.invert(thisX);
    if (isNaN(+fmt(min).trim())) {
      if (pFlag==1) {
        min = +fmt(min).substr(0,fmt(min).length-1)/100
      } else {
        min = reverse(fmt(min));
      }
    } else {
      min = +fmt(min).trim();
    }
    prt.selectAll("g.handle.left").attr("title",function(d){ return 'The filtered minimum for '+filterFields[1][tempIndex]+' is '+min; });
  }


  filterFields[2][tempIndex] = min;
  filterFields[3][tempIndex] = max;
  window.filterFields = filterFields;


  if (!numericDims[tempIndex]) {
    console.log('new dimension');
    numericDims[tempIndex] = facts.dimension(function(p){ return p[d]; }); 
  }


  if (flag==0) {
    prt.classed("activeFilter",true);
    numericDims[tempIndex].filterFunction(function(p){ return p>=min && p<=max; });

  } else {
    prt.classed("activeFilter",false);
    numericDims[tempIndex].filterAll();
    // numericDims[tempIndex].dispose();
    // delete numericDims[tempIndex];
    // numericDims.splice(tempIndex,1);
    prt.selectAll("g.handle.left").attr("title",null);
    prt.selectAll("g.handle.right").attr("title",null);


  }
  console.log(numericDims);

  update();
  doHighlight();
  window.dragFlag=1;
}

0 个答案:

没有答案