将嵌套的JSON字符串嵌套到字典,并将对象用作键

时间:2018-10-18 16:00:29

标签: javascript json

我正在加载嵌套的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>

1 个答案:

答案 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循环以遍历并比较多个国家/地区数组(而不仅仅是比较单个国家/地区)对),并根据需要更新结果对象。