如何以可伸缩的方式分配javascript变量

如何以可伸缩的方式分配javascript变量,javascript,d3.js,dc.js,Javascript,D3.js,Dc.js,假设我有以下dc.js对象: var chart_11 = dc.barChart("#chart-11"), chart_12 = dc.barChart("#chart-12"), chart_13 = dc.barChart("#chart-13"), chart_21 = dc.barChart("#chart-21"), chart_22 = dc.barChart("#chart-22"), chart_23 = dc.

假设我有以下
dc.js
对象:

var chart_11   = dc.barChart("#chart-11"),
    chart_12   = dc.barChart("#chart-12"),
    chart_13   = dc.barChart("#chart-13"),
    chart_21   = dc.barChart("#chart-21"),
    chart_22   = dc.barChart("#chart-22"),
    chart_23   = dc.barChart("#chart-23");
接下来,我读入一些数据并用这些数据做一些事情:

d3.csv("../data/test_data.csv").then(function(data) {

    var var_names = ["x", "y", "z", "a", "b", "c"];

    var ndx = crossfilter(data),
        chart_11_dim = ndx.dimension(function(d) { return +d[var_names[0]]; }),
        chart_12_dim = ndx.dimension(function(d) { return +d[var_names[1]]; }),
        chart_13_dim = ndx.dimension(function(d) { return +d[var_names[2]]; }),
        chart_21_dim = ndx.dimension(function(d) { return +d[var_names[3]]; }),
        chart_22_dim = ndx.dimension(function(d) { return +d[var_names[4]]; }),
        chart_23_dim = ndx.dimension(function(d) { return +d[var_names[5]]; });

    var chart_11_min = +chart_11_dim.bottom(1)[0][var_names[0]],
        chart_11_max = +chart_11_dim.top(1)[0][var_names[0]],
        chart_12_min = +chart_12_dim.bottom(1)[0][var_names[1]],
        chart_12_max = +chart_12_dim.top(1)[0][var_names[1]],
        chart_13_min = +chart_13_dim.bottom(1)[0][var_names[2]],
        chart_13_max = +chart_13_dim.top(1)[0][var_names[2]],
        chart_21_min = +chart_21_dim.bottom(1)[0][var_names[3]],
        chart_21_max = +chart_21_dim.top(1)[0][var_names[3]],
        chart_22_min = +chart_22_dim.bottom(1)[0][var_names[4]],
        chart_22_max = +chart_22_dim.top(1)[0][var_names[4]],
        chart_23_min = +chart_23_dim.bottom(1)[0][var_names[5]],
        chart_23_max = +chart_23_dim.top(1)[0][var_names[5]];

});

虽然这项工作,它不是很干燥,也不容易保持规模。我知道必须有一种更好的方法来动态创建这些变量,但我不确定哪种方法(例如循环、映射、reduce)的缩放效果最好。我不经常使用javascript编写代码,因此我希望有经验的人能为我指明正确的方向。

您可以创建一个帮助文件,将变量导出为javascript模块

因此,在名为“data.js”的模块文件中,您可以有:

export const chart11   = dc.barChart("#chart-11"),
    chart12   = dc.barChart("#chart-12"),
    chart13   = dc.barChart("#chart-13"),
    chart21   = dc.barChart("#chart-21"),
    chart22   = dc.barChart("#chart-22"),
    chart23   = dc.barChart("#chart-23");
然后,无论何时需要引用someotherfile.js中的数据,都可以使用:

import {chart11, chart12, chart13, chart21, chart22, chart23} from '../data';

const chart11Min = chart11...

Idk,但这是整个节点环境中使用的模块模式。这允许单个模块声明和根据需要对该模块的任意多个导入引用。旁注:对于常量变量,建议使用
const
;对于动态变量,建议使用
let
。由于缺少区分,
var
关键字不是最佳做法。

如果需要多个类似变量,不要在全局范围内创建它们,而是将它们存储在
数组中。例如,
const charts=[];对于(设i=1;i<3;++i)图[i]=db.barChart(`chart-${i}`)
拥有这个数组后,应该很容易推断出其余的干编码。如果你的变量需要一个数字,它可能不应该是一个变量。@KevinB除非是数学:
x1,y1,x2,y2
:我认为这类问题与a和问题本身更相关,您可以选择将所有这些变量作为动态创建的对象的属性。选中“使用动态关键点创建对象”复选框。创建对象后,您可以在
循环中使用
for…或使用
object.keys(…).forEach(…)