如何在dc.js中将过滤表达式放入变量中

How to put filteration expressions in vars in dc.js?

本文关键字:表达式 变量 过滤 dc js      更新时间:2023-09-26

在我们的dc.js供电d3.js图中

尝试使用代码附加方法在交叉过滤器的filter函数中连接几个布尔表达式。

var field1 = true,
  field2 = "XYZ",
  field3 = "ABC",
  field4 = 1
var filteredData = jsonObject.filter(function(d) {
  //condition 1
  if (field1 != true && field2 != "GHI") {
    var _dataFilter = d.FieldOne >= field1 &&
      d.FieldTwo <= field2 &&
      d.FieldThree == field3 &&
      d.FieldFour == field4
  }
  return _dataFilter;
});
console.log("FieldOne " + field1 + " FieldTwo " + field2 + " FieldThree " + field3 + " FieldFour " + field4);
var sourceDataForChart = crossfilter(filteredData);

我发现_dataFilter在控制台上作为nothing来。我的意思是什么都没有。没有未定义,没有对象,没有值,没有函数返回。sourceDataForChart是图表

所使用的数据

我需要实现它对于一个分组的需求,会有很多的条件。我该怎么做呢?

我同意Ethan的观点,这是一个JavaScript问题。

通常您不希望函数在某些情况下返回undefined,而在其他情况下返回值。变量_dataFilter只有在条件为真时才会初始化——而现在条件为假,因为field1为真。

实际上,只是因为JavaScript将所有变量都提升到函数作用域,所以变量在返回时才存在。所以也许这就是为什么调试器没有报告值。

更好的代码组织应该是

var filteredData = jsonObject.filter(function(d) {
  var _dataFilter = false;
  // condition 1
  if (field1 != true && field2 != "GHI") {
      _dataFilter = d.FieldOne >= field1 &&
        d.FieldTwo <= field2 &&
        d.FieldThree == field3 &&
        d.FieldFour == field4
  }
  else if (/* more conditions */ ) {
       _dataFilter = /* ... */
  }
  return _dataFilter;
});