我正在加载嵌套的JSON查询,并且试图创建一个将特定对象作为键的字典。 Sp,在我的情况下,键将是国家/地区,然后每个字典值将具有日期和数字。我已经取得了进步,但仍停留在最后的职能上。我的代码段显示了HTML部分中的所有步骤。
所以,我实际上是在尝试转换它:
2018-05-01,Italy,25,2018-04-01,Italy,37,2018-05-01,France,30,2018-04-01,France,90
对此:
{"Italy":[{"Date":"2018-04-01","num":37},{"Date":"2018-05-01","num":25}],"France":[{"Date":"2018-04-01","num":90},{"Date":"2018-05-01","num":30}]}
然后将其转换为:
[
{
"Value": "Italy",
"num": 37,
"num2": 25
},
{
"Value": "France",
"num": 90,
"num2": 30
}
]
其中num
将具有第一个日期的编号,而num2
将具有第二个日期的编号。
如果您认为我的步骤太多,也可以随时提供一个完全不同的解决方案。
var json_data = {"headers":["Month","Country","Number"],"rows":[["2018-05-01","Italy",25],["2018-04-01","Italy",37],["2018-05-01","France",30],["2018-04-01","France",90]
]};
var dataRows = json_data.rows;
document.getElementById("yellow").innerHTML = dataRows;
//Returns unique values of a specific object of a JSON string
uniqueValues = (data,objectNum) => {
var uniqueValues = [];
data.forEach(function(item) {
var value = item[objectNum];
if (uniqueValues.indexOf(value) !== -1)
return false;
uniqueValues.push(value);
});
return uniqueValues;
}
var uniqueCountries = uniqueValues(dataRows,1);
document.getElementById("green").innerHTML = uniqueCountries;
var uniqueDates = uniqueValues(dataRows,0);
document.getElementById("blue").innerHTML = uniqueDates;
//Create dictionary function (transformed JSON)
createDict = (data,objectNum) => {
var dict =[];
var num = 0;
var num2 = 0;
for (i = 0; i < dataRows.length; i++)
{
var object = {"Date": dataRows[i][0].slice(0,10), "Value": dataRows[i][1], "num": dataRows[i][2]};
dict.push(object);
}
return dict;
}
var dictData = createDict(dataRows,2);
document.getElementById("orange").innerHTML = JSON.stringify(dictData);
//Function that will return the final output
function test (){
var sumMetric = {};
dictData.forEach(function(d) {
uniqueCountries.forEach(function(country) {
console.log(d.Date);
//d.num = +d.num;
sumMetric[country] = [];
uniqueDates.forEach(function(element) {
sumMetric[country].push({Date: d.Date, num: d.num});
});
});
});
document.getElementById("red").innerHTML =JSON.stringify(sumMetric);
return sumMetric;
}
test();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" charset="utf-8"></script>
<h4>Original JSON</h4>
<div style="background:yellow;" id="yellow"></div>
<h4>Unique Countries</h4>
<div style="background:green; color:white" id="green"></div>
<h4>Unique Dates</h4>
<div style="background:blue; color:white" id="blue"></div>
<h4>Dictionary Creation</h4>
<div style="background:orange;" id="orange"></div>
<h4>Wrong Output</h4>
<div style="background:red;" id="red"></div>
<h4>Expected Output</h4>
<div style="background:purple; color:white" id="purple">{"Italy":[{"Date":"2018-04-01","num":37},{"Date":"2018-05-01","num":25}],"France":[{"Date":"2018-04-01","num":90},{"Date":"2018-05-01","num":30}]}</div>
<h4>Final Output that I need</h4>
<div style="background:grey; color:black" id="purple">[
{
"Value": "Italy",
"num": 37,
"num2": 25
},
{
"Value": "France",
"num": 90,
"num2": 30
}
]<div>
答案 0 :(得分:1)
假设您的代码片段中的数组是正确的输入数据集(而不是问题开头的字符串)...
如果保证每个国家/地区的原始数组只有2个子数组,则可以使用reduce
按国家/地区键将其分组为一个对象,然后比较分组对象中的数组对以产生预期的结果。例如:
const data = [
["2018-05-01", "Italy", 25],
["2018-04-01", "Italy", 37],
["2018-05-01", "France", 30],
["2018-04-01", "France", 90]
];
let groups = data.reduce((acc, arr) => {
if (acc.hasOwnProperty(arr[1])) {
acc[arr[1]].push(arr);
} else {
acc[arr[1]] = [arr];
}
return acc;
}, {});
let results = [];
for (let g in groups) {
let obj = {value: g};
let a = groups[g][0];
let b = groups[g][1];
if (a[0] <= b[0]) {
obj.num = a[2];
obj.num2 = b[2];
} else {
obj.num = b[2];
obj.num2 = a[2];
}
results.push(obj);
}
console.log(results);
如果不能保证每个国家/地区的原始数组只有2个子数组,则必须修改上面的for...in
循环以遍历并比较多个国家/地区数组(而不仅仅是比较单个国家/地区)对),并根据需要更新结果对象。