やや高度な「Flot」jQueryプラグイングラフを作成しようとしています。そのためには、多次元オブジェクトが必要です(または少なくともそうだと思います)。
構造は次のようになります。
var datasets = {
"usa": {
label: "USA",
data: [[1988, 483994], [1989, 479060], [1990, 457648], [1991, 401949], [1992, 424705], [1993, 402375], [1994, 377867], [1995, 357382], [1996, 337946], [1997, 336185], [1998, 328611], [1999, 329421], [2000, 342172], [2001, 344932], [2002, 387303], [2003, 440813], [2004, 480451], [2005, 504638], [2006, 528692]]
},
"russia": {
label: "Russia",
data: [[1988, 218000], [1989, 203000], [1990, 171000], [1992, 42500], [1993, 37600], [1994, 36600], [1995, 21700], [1996, 19200], [1997, 21300], [1998, 13600], [1999, 14000], [2000, 19100], [2001, 21300], [2002, 23600], [2003, 25100], [2004, 26100], [2005, 31100], [2006, 34700]]
}
};
私のコードビハインドから、次のようなリストをいくつか生成しました(同じデータではありませんが、気にしないでください):
<ul id="MOBILISATION">
<li data-key="2012/3/27">02:10</li>
<li data-key="2012/3/28">05:25</li>
<li data-key="2012/3/29">09:21</li>
<li data-key="2012/3/30">00:00</li>
<li data-key="2012/3/31">00:00</li>
</ul>
<ul id="OPERATIONS">
<li data-key="2012/3/27">19:51</li>
<li data-key="2012/3/28">18:35</li>
<li data-key="2012/3/29">14:39</li>
<li data-key="2012/3/30">07:46</li>
<li data-key="2012/3/31">10:26</li>
</ul>
「USA/usa」が「MOBILISATION」、「1988」が「2012/3/27」、「483994」が「02:10」の場合。あなたは写真を撮る!! ??
JQueryを書いてみましたが、明らかに機能しません。
var objects = [];
var array = [];
var categoryName = "";
$('div#Container ul').each(function () {
catName = $(this).attr('id');
$('li', this).each(function () {
array.Push([new Date($(this).data('key')).getTime(), $(this).text()]);
});
objects.Push({ categoryName: { label: categoryName, data: array} });
});
var datasets = objects;
ご覧のとおり、Push to objects
配列を使用しました。明らかに、それは私が望む結果を私に与えていません。 javascript/jQueryオブジェクトを操作するのは初めてなので、これで上下に何が起こっているのかがわかりません。これに対する最善の解決策は何ですか?
データセットは配列ではなくオブジェクトであり、プッシュすることはできません。また、変数categoryName
はそのようには機能しません(詳細は ドットとブラケットの表記 を参照してください)。これを試して:
var datasets = {};
$('div#Container ul').each(function () {
catName = this.id;
var array = [];
$('li', this).each(function () {
array.Push([
new Date($(this).data('key')).getTime(),
$(this).text()
]);
});
datasets[catName.toLowercase()] = {
label: catName.toUppercase(),
data: array
};
});
また、本当にDate
オブジェクトを作成する必要があるかどうかはわかりませんが、それは入力形式と出力形式によって異なります。
変化する var objects = [];
からvar objects = {};
そして変更
objects.Push({ categoryName: { label: categoryName, data: array} });
に
objects[categoryName] = { label: categoryName, data: array};
JSONオブジェクトで発生する問題は、変数インデックスを使用してプロパティを設定することです。上記のように、Yuoは配列表記を使用してこれを行うことができます。
試してみてください
var data = {};
$('div#Container ul').each(function() {
var sub_obj = data[$(this).attr('id').toLowerCase()] = {
label: $(this).attr('id').toUpperCase(),
data: []
};
$(this).children('li').each(function() {
sub_obj.data.Push([$(this).data('key'), $(this).text()]);
});
});
console.log(data);
これを試して:
var datasets = {};
$('ul').each(function (i, v) {
catName = $(this).attr('id');
datasets[catName] = {
label : catName,
data: []
};
$('li', this).each(function () {
datasets[catName].data.Push([new Date($(this).data('key')).getTime(), $(this).text()]);
})
});
function convertObject(obj, key) {
let returnObje = {};
if (!key) key = "";
else key = key + "_";
Object.keys(obj).forEach(function (k1) {
if (obj[k1] != null && typeof obj[k1] == "object") {
returnObje = Object.assign({}, returnObje, convertObject(obj[k1], key + k1))
} else
returnObje[key + k1] = obj[k1];
});
return returnObje;
}
var hotels = {
"hilton": {"name": "hilton hotel" },
"newton": {"name": "newton hotel"}
};
convertObject(hotels);