DataSet

DataSet

全局命名空间 DataSet,同时也是数据集类的构造函数。

常量 Constants

DataSet.CONSTANTS

常量,譬如 DataSet.HIERARCHY 是树形结构的名称。

DataSet.connectors

存储已注册的 Connector(key-value 对)。

DataSet.transforms

存储已注册的 Transform(key-value 对)。

类 Classes

DataSet

数据集构造函数。

new DataSet()

new DataSet(options = {}) 创建并返回 DataSet 实例。具体参数见示例代码。

| | options | Object | 是 |

  1. const ds = new DataSet({
  2. state: {
  3. // 指定初始化状态量
  4. foo: 'bar',
  5. },
  6. });

ds.isDataSet

判断是否是 DataSet 时使用,ds.isDataSet === true

ds.views

存储所有挂在数据集上的数据视图(key-value 对)。

ds.state

存储数据集上的状态量(key-value 对)。

ds.createView()

> alias ds.view()

ds.createView([name, ]options = {}) 创建并返回一个数据视图实例。

| | name | String | 是 | | options | Object | 是 |

  1. const dv0 = ds.createView();
  2. const dv1 = ds.createView('foo');
  3. const dv2 = ds.createView('bar', {
  4. watchingStates: ['fakeState'],
  5. });
options.watchingStates

创建数据视图实例时,传入的 watchingStates 是用于指定该数据视图监听的 states 状态量的。默认监听所有状态量(也就是任何状态量变更都会导致数据视图重新计算),如果指定为空数组 [],则不监听任何状态量,如果指定为非空数组,则只监听数组元素对应的状态量变更。

ds.getView()

ds.getView(name) 返回 name 对应的数据视图实例。

| | name | String | 否 |

  1. const dv = ds.getView('foo');

ds.setView()

ds.setView(name, dv) 设置 name 对应的数据视图实例为 dv。

| | name | String | 否 | | dv | DataSet.View | 否 |

  1. ds.setView('foo', new DataSet.View());

ds.setState()

ds.setState(name, value) 设置状态量 name 的值为 value。

> 注意!这个操作会使得关联了状态量 name 的数据视图对象重新执行所有数据处理流程。这个接口为数据集合上挂载的数据视图之间提供了通信通道。

> 注意!更改状态量必须调用这个接口,而不能直接用 ds.state.xxx = 'yyy' 这种方式。

| | name | String | 否 | | value | Any | 否 |

  1. ds.setState('foo', 'bar');

ds.on()

ds.on(name, callback) 监听数据集上的 name 事件。

| | name | String | 否 | | callback | Function | 否 |

目前支持的事件有

  • statechange 状态量变化事件,在调用 setState() 方法后触发。

> 注意!这个事件在状态量改变后不是同步触发的,而是在 setState 被调用后异步触发的。

> 目前搜索监听了某个 state 值的数据视图自动监听这个事件。

  1. ds.on('statechange', (name, value) => {
  2. console.log(`state ${name}'s value has been changed to ${value}!`);
  3. });

ds.emit()

ds.emit(name, …params) 手动触发数据集上的 name 事件。

| | name | String | 否 | | params | Arguments | 是 |

目前支持的事件有

  • statechange 状态量变化事件,触发后状态量关联的数据视图会重新执行所有数据处理流程。

DataSet.DataView

> alias DataSet.View

数据视图构造函数。

new DataView()

> alias DataSet.View

const dv = new DataSet.DataView(ds, options = {}) 创建并返回数据视图实例,具体参数见代码。

| | ds | DataSet | 是 | | options | Object | 是 |

  1. const dv0 = new DataSet.DataView();
  2. const dv1 = new DataSet.DataView(ds, {
  3. watchingStates: ['foo'], // 监听 `foo` 状态量变化,默认监听 ds 上的所有状态量
  4. });

dv.isView

> alias dv.isDataView

dv.loose

是否关联了数据集。ds.createView()方式创建的数据视图实例为 falsenew DataSet.DataView(options) 方式创建的则为 true

dv.dataType

数据类型,默认为 DataSet.TABLE,可选值有:DataSet.TABLE(普通二维数据),DataSet.GEO(地理数据), DataSet.HIERARCHY(树结构数据),和DataSet.GRAPH(图数据)。

dv.origin

存储原始数据。

dv.rows

存储处理后的数据。

dv.transforms

存储已应用的 transform(数组)。

dv.source()

dv.source(data, options) 载入数据。

| | data | String / Array / Object / DataView | 否 | | options | Object | 是 |

data 是原始数据,可能是字符串,也可能是数组、对象,或者另一个数据视图实例。options 里指定了载入数据使用的 connector 和载入时使用的配置项。

详细文档见 Connector API。

dv.transform()

dv.transform(options) 执行数据处理。

| | options | Object | 否 |

options 里指定了处理数据使用的 transform 和数据处理的配置项。

详细文档见 Transform API。

方法 Functions

DataSet.registerConnector()

DataSet.registerConnector(name, callback) 注册一个数据连接函数,注册后所有数据视图都可以使用 name 来引用这个数据连接函数,从而接入某种数据源。

| | name | String | 否 | | callback | Function | 否 |

callback 接受两个参数:原始数据和配置项。返回值就是 DataView 实例所需要的数据。举个简单例子,如果要注册一个接入 CSV 数据的 Connector,则实现如下:

  1. const _ = require('lodash');
  2. const { csvParse } = require('d3-dsv');
  3. DataSet.registerConnector('csv', (data, options = {}) => {
  4. const delimiter = options.delimiter || ',';
  5. if (!isString(delimiter)) {
  6. throw new TypeError('Invalid delimiter: must be a string!');
  7. }
  8. return dsvFormat(delimiter).parse(str);
  9. });
  10. const testCSV = `Expt,Run,Speed
  11. 1,1,850
  12. 1,2,740
  13. 1,3,900
  14. 1,4,1070`;
  15. const dv = new DataSet.View().source(testCSV, {
  16. type: 'csv',
  17. });
  18. console.log(dv.rows);
  19. /*
  20. * dv.rows:
  21. * [
  22. * {Expt: " 1", Run: "1", Speed: "850"}
  23. * {Expt: " 1", Run: "2", Speed: "740"}
  24. * {Expt: " 1", Run: "3", Speed: "900"}
  25. * {Expt: " 1", Run: "4", Speed: "1070"}
  26. * ]
  27. */

DataSet.getConnector()

DataSet.getConnector(name) 返回 name 对应的 Connector。

| | name | String | 否 |

DataSet.registerTransform()

DataSet.registerTransform(name, callback) 注册一个数据处理函数,注册后所有数据视图都可以使用 name 来引用这个数据处理函数,从而进行某种数据处理。

| | name | String | 否 | | callback | Function | 否 |

callback 接受两个参数:数据视图(DataSet.View)实例和配置项。举个简单例子,如果要注册一个过滤数据的 Transform,则实现如下:

  1. // 承接上述 Connector 的代码
  2. DataSet.registerTransform('filter', (dv, options = {}) => {
  3. dv.rows = dv.rows.filter(options.callback || (row => !!row));
  4. });
  5. dv.transform({
  6. type: 'filter',
  7. callback(row) {
  8. return row.Run !== '1';
  9. },
  10. });
  11. console.log(dv.rows);
  12. /*
  13. * dv.rows:
  14. * [
  15. * {Expt: " 1", Run: "2", Speed: "740"}
  16. * {Expt: " 1", Run: "3", Speed: "900"}
  17. * {Expt: " 1", Run: "4", Speed: "1070"}
  18. * ]
  19. */

DataSet.getTransform()

DataSet.getTransform(name) 返回 name 对应的 Transform。

| | name | String | 否 |