【问题标题】:How to select JSON arrays with D3.js with . operator如何使用 D3.js 和 .操作员
【发布时间】:2023-03-27 14:45:01
【问题描述】:

我正在使用 D3.js 从 JSON 文件创建条形图。我希望用户通过不同的年份和不同的国家进行过滤。我似乎无法弄清楚如何从 JSON 文件中选择不同的数组。

我的 JSON 是这样设置的:(这可能是错误的)

var NL = [
    j1996 = [20317, 27395, 29273, 27170, 19441],
    j1997 = [25267, 31331, 35193, 35299, 23005],
    j1998 = [25576, 30643, 35484, 35796, 23343]
]

var BE = [
    j1996 = [52317, 17395, 39273, 47170, 39441],
    j1997 = [35267, 13331, 15193, 15299, 13005],
    j1998 = [15576, 20643, 14284, 25796, 13343]
] 

然后我有加载不同年份数据的按钮:

d3.select("#button1996")
    .on("click", function (d, i) {
        bars(j1996);
    })
d3.select("#button1997")
    .on("click", function (d, i) {
        bars(j1997);
    })
d3.select("#button1998")
    .on("click", function (d, i) {
        bars(j1998);
    })

条形函数

function bars(data) {

max = d3.max(data)

var yScale = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([0, height])    

var xScale = d3.scale.ordinal()
    .domain(d3.range(0, data.length))
    .rangeBands([0, width], .2)    

var myChart = d3.select("#chart")

var bars = myChart.selectAll("rect.bar")
    .data(data)

//enter
bars.enter()
    .append("svg:rect")
    .attr("class", "bar")
    .style('fill', '#C64567')
    .attr('width', xScale.rangeBand())
    .attr('x', function(d,i){ return xScale(i); })
    .attr('height', 0)
    .attr('y', height)
}

这行得通

    d3.select("#button1996")
    .on("click", function (d, i) {
        bars(NL[0]);
    })

如何在 NL 和 BE 数组之间切换(将来会更多),但还记得最后选择的年份吗?

【问题讨论】:

  • 你的'bars'函数是什么样的?您需要添加更多代码...
  • 感谢您的关注!我添加了条形功能,并在底部稍微改写了问题。

标签: javascript arrays json d3.js dot-operator


【解决方案1】:

问题似乎是你试图让NL 既是一个数组又是一个对象。

你的声明

var NL = [
  j1996 = [20317, 27395, 29273, 27170, 19441],
  j1997 = [25267, 31331, 35193, 35299, 23005],
  j1998 = [25576, 30643, 35484, 35796, 23343]
]

给出与

相同的结果
var NL = [
  [20317, 27395, 29273, 27170, 19441],
  [25267, 31331, 35193, 35299, 23005],
  [25576, 30643, 35484, 35796, 23343]
]

即,它是一个数组数组。所以不希望以这种方式访问​​ NL.j1996(确切地说,您还将每个数组影响到相应的全局变量 j199x)。

如果要使用NL作为对象,语法如下:

var NL = {
  j1996 : [20317, 27395, 29273, 27170, 19441],
  j1997 : [25267, 31331, 35193, 35299, 23005],
  j1998 : [25576, 30643, 35484, 35796, 23343]
}

那么NL.j1996 就不会再产生错误了。

【讨论】:

  • 感谢您的解释!像魅力一样工作!
【解决方案2】:
var NL = [
    j1996 = [20317, 27395, 29273, 27170, 19441],
    j1997 = [25267, 31331, 35193, 35299, 23005],
    j1998 = [25576, 30643, 35484, 35796, 23343]
]

var BE = [
    j1996 = [52317, 17395, 39273, 47170, 39441],
    j1997 = [35267, 13331, 15193, 15299, 13005],
    j1998 = [15576, 20643, 14284, 25796, 13343]
] 

那是错误的格式,NL 和 BE 应该是包含这样的数组的对象:

var NL = {
    j1996 : [20317, 27395, 29273, 27170, 19441],
    j1997 : [25267, 31331, 35193, 35299, 23005],
    j1998 : [25576, 30643, 35484, 35796, 23343]
}

var BE = {
    j1996 : [52317, 17395, 39273, 47170, 39441],
    j1997 : [35267, 13331, 15193, 15299, 13005],
    j1998 : [15576, 20643, 14284, 25796, 13343]
}

因为它是一个对象,所以你不能这样称呼它:

d3.select("#button1996")
    .on("click", function (d, i) {
        bars(NL[0]);
    })

你必须这样做:

d3.select("#button1996")
    .on("click", function (d, i) {
        bars(NL['j1996']);// or 
        //bars(NL.j1996);
    })

【讨论】:

    【解决方案3】:

    您的 JSON 格式错误。 使用类似的东西。您可以通过以下方式访问您的数据:

     data.NL[0], etc
    

    您的 JSON 应具有以下格式:

    {
    "NL": [{
        "j1996": [20317, 27395, 29273, 27170, 19441],
        "j1997": [20317, 27395, 29273, 27170, 19441],
        "j1998": [20317, 27395, 29273, 27170, 19441]
    }],
    "NL": [{
        "j1996": [20317, 27395, 29273, 27170, 19441],
        "j1997": [20317, 27395, 29273, 27170, 19441],
        "j1998": [20317, 27395, 29273, 27170, 19441]
    }]
    
    }
    

    不要忘记使用http://jsonlint.com/ 之类的工具验证您的 JSON。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-23
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 2017-01-09
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多