gpt4 book ai didi

javascript - 循环遍历 json 数组属性

转载 作者:行者123 更新时间:2023-12-03 11:43:58 27 4
gpt4 key购买 nike

我正在使用 JQuery、ChartJS、Moment.js 为同一页面上的多个图表收集 JSON 格式的数据,但来自相同的 JSON 源。在 JSON 中,高度对象是一张图,长度是另一张图。这是 JSON 外观的示例

  "Series": {
"heights": [
{
"Date": "2014-10-01",
"Value": 22
},
{
"Date": "2014-10-01",
"Value": 53
},
{
"Date": "2014-10-01",
"Value": 57
},
],
"lengths": [
{
"Date": "2014-10-01",
"Value": 54
},
{
"Date": "2014-10-01",
"Value": 33
}
]
}

我已经设法循环遍历 JSON 以显示每个图表,但我实际上无法使用“DRY - 不要重复自己”的方式来做到这一点。现在我有大量难以更新/读取的代码。

$.getJSON("data.json", function(data) {
var dateArray = [];
var valueArray = [];

for ( var i = 0; i < data.Series["heights"].length; i++) {

var obj = data.Series.heights[i];
var date = obj["Date"].toString();
var Value = obj["Value"];

for ( var key in obj) {
//console.log(obj["Value"]);
//date = obj["Date"];
Value = obj[key].toString();

}
valueArray.push(Value);
dateArray.push(moment(date).format("MMMM Mo"));

var dataArray = {
labels: dateArray,
datasets: [
{
label: "Lengths",

strokeColor: "rgb(26, 188, 156)",
pointColor: "rgba(220,220,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: valueArray
}
]
};

}
var ctx = document.getElementById("lengthsChart").getContext("2d");
var myLineChart = new Chart(ctx).Line(dataArray, {
scaleShowGridLines : true,
bezierCurve : true,
bezierCurveTension : 0.4,
datasetStroke : false,
fillColor: "rgba(0,0,0,0)",
datasetFill : false,
responsive: true,
showTooltips: true,
animation: false
});
});
<小时/>

现在我在“高度”、“长度”等的 switch 语句中有这段代码......我认为这是一种可怕的方法。但我无法为各个图表制作循环。

我尝试过这样的事情:

for(var x in measurement) {
console.log(measurement[x]);


for ( var i = 0; i < data.Series.hasOwnProperty(measurement).length; i++) {

var obj = data.Series.hasOwnProperty(measurement)[i];
var date = obj["Date"].toString();
var Value = obj["Value"];

console.log(date, Value);
}

但我无法让它工作,无法循环 data.Series。/高度/长度../[i]

非常感谢您提供如何实现此目标的提示。

谢谢!

最佳答案

如果您将 measurement 替换为 data.Series 并去掉 hasOwnProperty(measurement) 内容,那么您就快成功了。您唯一需要的是一种将 {Date, Value} 对象列表转换为每个系列的一对日期和值列表的方法。

var series = {};
// This loop is looping across all the series.
// x will have all the series names (heights, lengths, etc.).
for (var x in data.Series) {
var dates = [];
var values = [];
// Loop across all the measurements for every serie.
for (var i = 0; i < data.Series[x].length; i++) {
var obj = data.Series[x][i];
// Assuming that all the different series (heights, lengths, etc.) have the same two Date, Value attributes.
dates.push(obj.Date);
values.push(obj.Value);
}
// Keep the list of dates and values by serie name.
series[x] = {
dates: dates,
values: values
};
}

系列将包含以下内容:

{
heights: {
dates: [
'2014-10-01',
'2014-10-01',
'2014-10-01'
],
values: [
22,
53,
57
]
},
lengths: {
dates: [
'2014-10-01',
'2014-10-01'
],
values: [
54,
33
]
}
}

所以你可以像这样使用它们:

console.log(series);
console.log(series.heights);
console.log(series.heights.dates);
console.log(series.heights.values);
console.log(series.lengths);
console.log(series.lengths.dates);
console.log(series.lengths.values);

关于javascript - 循环遍历 json 数组属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140707/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com