Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何访问数组中的数据_Javascript_D3.js_Multidimensional Array - Fatal编程技术网

Javascript 如何访问数组中的数据

Javascript 如何访问数组中的数据,javascript,d3.js,multidimensional-array,Javascript,D3.js,Multidimensional Array,如何访问d3.js中多维数组中的数据 我用一维数组创建了这个小火花。 但是,当我想使用多维数组创建更多的火花线时,该怎么办呢 我有这个效果 var canvasWidth = 200, canvasHeight = 150; var pathData = [ { "x": 0, "y": 50}, { "x": 20, "y": 20}, { "x": 60, "y": 40}, { "x": 80, "y": 30}, { "x": 12

如何访问d3.js中多维数组中的数据

我用一维数组创建了这个小火花。 但是,当我想使用多维数组创建更多的火花线时,该怎么办呢

我有这个效果

    var canvasWidth  = 200,
    canvasHeight = 150;

var pathData = [
  { "x": 0,   "y": 50}, 
  { "x": 20,  "y": 20},
  { "x": 60,  "y": 40}, 
  { "x": 80,  "y": 30}, 
  { "x": 120, "y": 90},
  { "x": 150, "y": 70}, 
  { "x": 180, "y": 30},
  { "x": 190, "y": 90},
];

var widthScale = d3.scaleLinear()
  .domain([0, 190])
  .range([0, canvasWidth - 30]);

var heightScale = d3.scaleLinear()
  .domain([0, 90])
  .range([0, canvasHeight - 10]);

// Canvas
var canvas = d3.select("body")
  .append("svg")
  .attr("width", canvasWidth)
  .attr("height", canvasHeight)
    .append("g")
    .attr("transform","translate(20)");

// _+_+_+_+_+_+_+_+ Basic of Data --> SVG Path _+_+_+_+_+_+_+_+ //

// Create accessor function
var pathFunction = d3.line()
  .x(function(d) { return widthScale(d.x); })
  .y(function(d) { return heightScale(d.y); })
  .curve(d3.curveCatmullRom);

// Create <path> and append accessor function
var path = canvas.append("path")
  .attr("d", pathFunction(pathData))
  .attr("stroke", "red")
  .attr("stroke-width", 2)
  .attr("fill", "none");

// Add data points 
var circles = canvas.selectAll("circle")
  .data(pathData)
  .enter()
  .append("circle")
    .attr("cx", function(d) { return widthScale(d.x) })
    .attr("cy", function(d) { return heightScale(d.y) })
    .attr("fill", "black")
    .attr("r", 4);
`


CX和CY位置为NaN。还有,只有3个圆,而不是8个圆作为数组长度()

我发现检查类似问题的一种有用方法是将“d”值记录到控制台:

.attr("cx", function(d,i) { console.log(d); return widthScale(d.x) })
这可能会突出显示,因为您现在使用的是多维数组,绑定到圆元素的数据不再为您提供对数据点的即时访问。以下类似的方法可能会起作用:

.attr("cx", function(d,i) { return widthScale(d[i].x) })

您只需进行一次修改:

由于有3个内部数组,每个SVG都有一个这样的数组作为数据绑定。所以,当涉及到附加圆,而不是

var circles = canvas.selectAll("circle")
    .data(pathData)
    .enter()        
    .append("circle")
,它指向整个数据数组,它应该是

var circles = canvas.selectAll("circle")
    .data(d => d)
    .enter()        
    .append("circle")
。。。这使得内部数组(即绑定到每个SVG的数据)成为每组圆的数据数组

这是您的工作代码,仅进行了修改(此外,您在
高度刻度上有一个打字错误
):

var canvasWidth=200,
画布高度=150;
变量路径数据=[
[
{x:0,y:50},{x:20,y:20},
{“x:60,y:40},{“x:80,y:30},
{“x”:120,“y”:90},{“x”:150,“y”:70},
{“x”:180,“y”:30},{“x”:190,“y”:90},
],
[    
{x:0,y:90},{x:20,y:20},
{x:30,y:80},{x:80,y:30},
{“x”:120,“y”:90},{“x”:150,“y”:70},
{“x”:180,“y”:30},{“x”:190,“y”:90},
],
[    
{x:0,y:40},{x:20,y:20},
{x:30,y:80},{x:80,y:30},
{“x”:120,“y”:90},{“x”:150,“y”:70},
{“x”:180,“y”:30},{“x”:190,“y”:90},
]
];
var widthScale=d3.scaleLinear()
.domain([0190])
.范围([0,画布宽度-30]);
var heightScale=d3.scaleLinear()
.domain([0,90])
.范围([0,画布高度-10]);
//帆布
变量容器=d3。选择(“主体”)
//创建访问器函数
var pathFunction=d3.line()
.x(函数(d){返回宽度刻度(d.x);})
.y(函数(d){返回高度刻度(d.y);})
.曲线(d3.curveCatmullRom);
var canvas=container.selectAll(“svg”)
.data(路径数据)
.输入()
.append(“svg”)
.attr(“宽度”,画布宽度)
.attr(“高度”,画布高度)
.附加(“g”)
.attr(“转换”、“翻译(20)”);
var sparklines=canvas.append(“路径”)
.attr(“d”,路径函数)
.attr(“笔划”,“19ff9f”)
.attr(“笔划宽度”,2)
.attr(“填充”、“无”);
var circles=canvas.selectAll(“圆”)
.数据(d=>d)
.输入()
.附加(“圆圈”)
.attr(“cx”,函数(d,i){返回宽度标度(d.x);})
.attr(“cy”,函数(d,i){返回高度刻度(d.y);})
.attr(“填充”、“黑色”)
.attr(“r”,3)

非常感谢!效果不错。我很想知道这段代码是如何工作的-.data(d=>d)?如果我有更多的数组,例如这3个数组中的每一个都有2个数组呢?这只是一个粗箭头,表示每组圆的数据都是每个内部数组。如果您有更深的数组,只需继续附加组,或者在您的情况下附加SVG。
var circles = canvas.selectAll("circle")
    .data(d => d)
    .enter()        
    .append("circle")