Javascript 尝试在数组中为每个项创建新的json对象

Javascript 尝试在数组中为每个项创建新的json对象,javascript,arrays,json,charts,Javascript,Arrays,Json,Charts,我有这种结构的大型json文件,每个文件中只有更多的图表: { "Name": "test", "Charts": [ { "chartName": "Idle Times", "disk": 0, "OpCode": "Read", "xAxis": [0,100,200,300,400,500], "yAxis": [337487,8565,11419,9704,7598] }

我有这种结构的大型json文件,每个文件中只有更多的图表:

{ 
    "Name": "test", 
    "Charts": [
    {
        "chartName": "Idle Times",
        "disk": 0,
        "OpCode": "Read",
        "xAxis": [0,100,200,300,400,500],
        "yAxis": [337487,8565,11419,9704,7598]
    },
    {
        "chartName": "Idle Times",
        "disk": 0,
        "OpCode": "Read",
        "xAxis": [0,100,200,300,400,500],
        "yAxis": [337487,8565,11419,9704,7598]
    }]
}
问题是所有图表数据,x-y数据,都是数组,我使用的javascript图表工具需要json如下所示:

{"chartName":"Idle Times", "disk":0, "OpCode":"Read","xAxis":0, "yAxis":1234},
{"chartName":"Idle Times", "disk":0, "OpCode":"Read","xAxis":100, "yAxis":1234},
{"chartName":"Idle Times", "disk":0, "OpCode":"Read","xAxis":200, "yAxis":1234},
{"chartName":"Idle Times", "disk":0, "OpCode":"Read","xAxis":300, "yAxis":1234},
{"chartName":"Idle Times", "disk":0, "OpCode":"Read","xAxis":400, "yAxis":1234},
{"chartName":"Idle Times", "disk":0, "OpCode":"Read","xAxis":500, "yAxis":1234},
{"chartName":"Idle Times", "disk":0, "OpCode":"Read","xAxis":600, "yAxis":1234}
我的应用程序目前正在使用AngularJS、JSLINQ、D3JS和DimpleJS。如果有办法用这些工具来实现这一点,那将是理想的。我还对另一个开源库持开放态度,我只是希望我不必读入整个json文件,然后用一堆复杂的for循环将其恢复,基本上是一行一行地手工构建新的json

如果有什么东西可以像我现在所拥有的那样读取json数据,我也愿意切换到另一个图表工具,DimpleJS非常容易使用,看起来非常清晰


提前感谢您的帮助

似乎需要调整输入以匹配图表库的预期格式。下面是一个片段,展示了如何做到这一点

对于给定的输入:

var obj = {
    "chartName": "Idle Times",
    "disk": 0,
    "OpCode": "Read",
    "xAxis": [0,100,200,300,400],
    "yAxis": [337487,8565,11419,9704,7598]
};
循环通过xAxis值:

var results = [];
for (var i = 0; i < obj.xAxis.length; i++) {
  results.push({
    "chartName":obj.chartName, 
    "disk":obj.disk,
    "OpCode":obj.OpCode,
    "xAxis":obj.xAxis[i],
    "yAxis":obj.yAxis[i]
  });
}
var结果=[];
for(var i=0;i
您似乎需要调整输入以匹配图表库的预期格式。下面是一个片段,展示了如何做到这一点

对于给定的输入:

var obj = {
    "chartName": "Idle Times",
    "disk": 0,
    "OpCode": "Read",
    "xAxis": [0,100,200,300,400],
    "yAxis": [337487,8565,11419,9704,7598]
};
循环通过xAxis值:

var results = [];
for (var i = 0; i < obj.xAxis.length; i++) {
  results.push({
    "chartName":obj.chartName, 
    "disk":obj.disk,
    "OpCode":obj.OpCode,
    "xAxis":obj.xAxis[i],
    "yAxis":obj.yAxis[i]
  });
}
var结果=[];
for(var i=0;i
那么,如果我理解正确,您想将每个
x
y
坐标展开为单独的点吗? 试着这样做:

var source = { 
    "Name": "test", 
    "Charts": [
    {
        "chartName": "Idle Times",
        "disk": 0,
        "OpCode": "Read",
        "xAxis": [0,100,200,300,400,500],
        "yAxis": [337487,8565,11419,9704,7598]
    },
    {
        "chartName": "Idle Times",
        "disk": 0,
        "OpCode": "Read",
        "xAxis": [0,100,200,300,400,500],
        "yAxis": [337487,8565,11419,9704,7598]
    }]
};

var data = source.Charts.reduce(function(prev, now) {
  var target = [];
  for(var i = 0, len = now.yAxis.length; i < len; i++) {
    target.push({
      "chartName": now.chartName,
      "disk": now.disk,
      "OpCode": now.OpCode,
      "xAxis": now.xAxis[i],
      "yAxis": now.yAxis[i]
    })
  }
  return prev.concat(target)
}, [])
var-source={
“名称”:“测试”,
“图表”:[
{
“图表名称”:“空闲时间”,
“磁盘”:0,
“操作码”:“读取”,
“xAxis”:[01002000300400500],
“yAxis”:[33748785651141997047598]
},
{
“图表名称”:“空闲时间”,
“磁盘”:0,
“操作码”:“读取”,
“xAxis”:[01002000300400500],
“yAxis”:[33748785651141997047598]
}]
};
var data=source.Charts.reduce(函数(上一个,现在){
var目标=[];
for(var i=0,len=now.yAxis.length;i

只要你有相同数量的点,这就行。

那么,如果我理解正确,你想把每个
x
y
坐标展开成单独的点吗? 试着这样做:

var source = { 
    "Name": "test", 
    "Charts": [
    {
        "chartName": "Idle Times",
        "disk": 0,
        "OpCode": "Read",
        "xAxis": [0,100,200,300,400,500],
        "yAxis": [337487,8565,11419,9704,7598]
    },
    {
        "chartName": "Idle Times",
        "disk": 0,
        "OpCode": "Read",
        "xAxis": [0,100,200,300,400,500],
        "yAxis": [337487,8565,11419,9704,7598]
    }]
};

var data = source.Charts.reduce(function(prev, now) {
  var target = [];
  for(var i = 0, len = now.yAxis.length; i < len; i++) {
    target.push({
      "chartName": now.chartName,
      "disk": now.disk,
      "OpCode": now.OpCode,
      "xAxis": now.xAxis[i],
      "yAxis": now.yAxis[i]
    })
  }
  return prev.concat(target)
}, [])
var-source={
“名称”:“测试”,
“图表”:[
{
“图表名称”:“空闲时间”,
“磁盘”:0,
“操作码”:“读取”,
“xAxis”:[01002000300400500],
“yAxis”:[33748785651141997047598]
},
{
“图表名称”:“空闲时间”,
“磁盘”:0,
“操作码”:“读取”,
“xAxis”:[01002000300400500],
“yAxis”:[33748785651141997047598]
}]
};
var data=source.Charts.reduce(函数(上一个,现在){
var目标=[];
for(var i=0,len=now.yAxis.length;i

只要你有相同数量的点数,这应该有效。

当与
xAxis
相关时,你的
yAxis
值应该是多少?1234对此只字不提(不幸的是;)是的,我只是加入了一些值来显示它们应该在哪里。每个y值始终有一个x值。每个图表的x-y对变化量查找与您的数据格式匹配的图表库可能是一项艰巨的任务。我认为以适合您选择的图表库的格式保存数据或“使用一堆复杂的循环在现有数据上循环”更为实际:)(其实没那么复杂。)我同意@bloodyKnuckles。实际的json重建是通过蹩脚的快速循环进行的。当与
xAxis
相关时,您的
yAxis
值应该是什么?1234对此只字不提(不幸的是;)是的,我只是加入了一些值来显示它们应该在哪里。每个y值始终有一个x值。每个图表的x-y对变化量查找与您的数据格式匹配的图表库可能是一项艰巨的任务。我认为以适合您选择的图表库的格式保存数据或“使用一堆复杂的循环在现有数据上循环”更为实际:)(其实没那么复杂。)我同意@bloodyKnuckles。通过蹩脚的快速循环实际重建json就是一种方法。请注意,如果x和y值的数量不匹配或诸如此类的情况,您需要添加一些错误处理。这将使您走上正确的轨道。请注意,如果x和y值的数量不匹配或诸如此类的情况,您将需要添加一些错误处理。这会让你走上正轨。谢谢大家的帮助!这两个答案都应该是有效的,而血之怒是正确的,它并不像我想的那么复杂。我把安德烈·内梅斯的答案标注为被接受,只是因为我不能同时标注这两个答案。再次感谢!这通常比你想象的要容易。我们很容易将头脑中的东西抽象出来,并将它们封装在库中,但实际上,通过简单的控制结构可以完成很多事情。在任何情况下,都可以看一看它和所有你可以用它做的有趣的事情。它非常强大:)谢谢大家的帮助!两者