Javascript 将Json数组合并到多维单个数组
下面是API中的JSON,我无法控制它,因此无法更改格式。我正在努力将这些JSON数据合并到单个JSON数组中 我的要求是将具有多个系列的网格数据显示为多列,如 日期|欧拉GT2 |牛顿|哥白尼GT 编辑:JSON合并将是这样的Javascript 将Json数组合并到多维单个数组,javascript,jquery,json,Javascript,Jquery,Json,下面是API中的JSON,我无法控制它,因此无法更改格式。我正在努力将这些JSON数据合并到单个JSON数组中 我的要求是将具有多个系列的网格数据显示为多列,如 日期|欧拉GT2 |牛顿|哥白尼GT 编辑:JSON合并将是这样的 "seriesData": [ { "DATE": "2013-12-10T00:00:00", "Euler GT2": 10.0, Newton": 45.0, Copernicus GT": 100.0, }
"seriesData": [
{
"DATE": "2013-12-10T00:00:00",
"Euler GT2": 10.0,
Newton": 45.0,
Copernicus GT": 100.0,
},
..]
此外,列的名称将是动态的(例如,DATE、Euler GT2以JSON格式提供,在设计期间不知道)
web API JSON如下所示-
jQuery21007295361300930381_1406200781162([
{
"seriesName": "Station All Cached0",
"seriesData": [
{
"DATE": "2013-12-10T00:00:00",
"Euler GT2": 10.0
},
{
"DATE": "2013-12-10T01:00:00",
"Euler GT2": 11.0
},
{
"DATE": "2013-12-10T02:00:00",
"Euler GT2": 0.59
}
]
},
{
"seriesName": "Station All Cached1",
"seriesData": [
{
"DATE": "2013-12-10T00:00:00",
"Newton": 45.0
},
{
"DATE": "2013-12-10T01:00:00",
"Newton": 34.0
},
{
"DATE": "2013-12-10T02:00:00",
"Newton": 47.0
}
]
},
{
"seriesName": "Station All Cached2",
"seriesData": [
{
"DATE": "2013-12-10T00:00:00",
"Copernicus GT": 100.0
},
{
"DATE": "2013-12-10T01:00:00",
"Copernicus GT": 0.0
},
{
"DATE": "2013-12-10T02:00:00",
"Copernicus GT": 100.0
}
]
}
])
从某种意义上讲,它可能很复杂,每个系列数据也可能有多个列。例如,系列1包含列“Date | column1 | column2…”。。。以此类推,但如果我从两列开始,会更简单。以下修改将以您期望的格式提供数据。但我建议将列数组(因为它们保持顺序)分开,将数据行分开。对于output2中给出的表/网格用例,这是更清晰、语义更丰富的数据
//Data here
var data = {.....}
var columns = {'DATE' : true};
var columnArray = ['DATE'];
var dateDataMap = {};
for(var i=0; i<data.length; i++){
var dataArray = data[i].seriesData;
for(var j=0; j<dataArray.length; j++){
var dataPoint = dataArray[j];
for(var index in dataPoint){
if(index!=='DATE'){
if(!columns[index]){
columns[index] = true;
columnArray.push(index);
}
dateDataMap[dataPoint['DATE']] = dateDataMap[dataPoint['DATE']] || {};
dateDataMap[dataPoint['DATE']][index] = dataPoint[index];
}
}
}
}
var finalDataArray = [];
for(var dateIndex in dateDataMap){
var dataPoint = dateDataMap[dateIndex];
dataPoint['DATE'] = dateIndex;
finalDataArray.push(dataPoint);
}
var rows = [];
var output = {seriesData : finalDataArray};
for(var i=0; i<finalDataArray.length; i++ ){
var dataPoint = finalDataArray[i];
var row = [];
for(var colIndex=0; colIndex<columnArray.length; colIndex++){
row.push(dataPoint[columnArray[colIndex]]);
}
rows.push(row)
}
var Output2 = {
column : columnArray,
rows : rows
}
//这里有数据
变量数据={…}
var columns={'DATE':true};
var columnArray=['DATE'];
var dateDataMap={};
对于(var i=0;i合并脚本:
var merged = (function(key){
var res = [];
for(var i=0;i<data.length;i++){
for(var j=0;j<data[i].seriesData.length;j++){
var obj = data[i].seriesData[j];
for(var prop in obj){
if(prop != key && obj.hasOwnProperty(prop)) {
if(res[obj[key]] === undefined){
res[obj[key]] = {};
res[obj[key]][key] = obj[key];
res.push(obj[key]);
}
res[obj[key]][prop] = obj[prop];
}
}
}
}
for(var k=0;k<res.length;k++){
var date = res[k];
res[k] = res[date];
delete res[date];
}
return res;
})('DATE');
演示:能否请您告诉我们合并后的多维单个阵列的外观,这将使我们对您的要求有一个大致的了解。目前还不清楚您希望数据是什么样的。您能否使用上述数据作为输入来写下结果?很抱歉,错过了重要部分。我现在编辑了我的问题。谢谢。我将尝试获得列数组作为“键”列“日期”也可以是字符串。把它当作日销售苹果,橙色和香蕉在三个JSON对象。所以我的关键是在这里的字符串(星期一,星期六…)。我将使用您的解决方案,并很快返回报告。已编辑答案以分别包含行和列。一个小问题,生成的json具有最后带有日期元素的对象,如何使其显示为第一个元素?(例如,请参见下面@manjiThats的评论,为什么我建议使用数组,并用它更新了答案。对象不保证迭代顺序,而数组保证迭代顺序。output2是列数组和行数组。
[
{
"DATE": "2013-12-10T00:00:00",
"Euler GT2": 10,
"Newton": 45,
"Copernicus GT": 100
},
{
"DATE": "2013-12-10T01:00:00",
"Euler GT2": 11,
"Newton": 34,
"Copernicus GT": 0
},
{
"DATE": "2013-12-10T02:00:00",
"Euler GT2": 0.59,
"Newton": 47,
"Copernicus GT": 100
}
]