[英]Javascript - Convert large object literal into another object literal
我試圖將Javascript對象文字轉換為另一個。 我認為有可能有一些循環,但我無法完成它。 目標結構如下所示,“convertedData”。
小提琴可以在這里找到: http : //jsbin.com/ajemih/9/edit
這是JSON數據:
var data =
{
"29-10-2012": {
"1a": {
"allMovement": "1",
"allLoad": "2",
"loadMovement": "3"
},
"1b": {
"allMovement": 4,
"allLoad": 5,
"loadMovement": 6
}
},
"22-02-2013": {
"1a": {
"allMovement": "7",
"allLoad": "8",
"loadMovement": "9"
},
"1b": {
"allMovement": "10",
"allLoad": "11",
"loadMovement": "12"
}
}
};
for (day in data) {
for (id in data[day]) {
document.write(data[day][id].allMovement+"<br>");
document.write(data[day][id].allLoad+"<br>");
document.write(data[day][id].loadMovement+"<br>");
}
}
/*
convertedData = [[1,7],
[2, 8],
[3, 9],
["4","10"],
["5","11"],
["6", "12"]];
convertedData = [["1a-allMovement-29-10-2012","1a-allMovement-22-02-2013],
["1a-allLoad-29-10-2012", "1a-allLoad22-02-2013"],
["1a-loadMovement-29-10-2012", "1a-loadMovement-22-02-2013"],
["1b-allMovement-29-10-2012","1a-allMovement-22-02-2013"],
["1b-allLoad-29-10-2012","1b-allLoad22-02-2013"],
["1b-loadMovement-29-10-2012", "1b-loadMovement-22-02-2013"]];
*/
嘗試這樣的事情,根據需要進行調整:
var out = [],
dateKey, idx, item, itemKey, inner;
for (dateKey in data) {
if (data.hasOwnProperty(dateKey)) {
idx = out.length;
out[idx] = [];
item = data[dateKey];
for (itemKey in item) {
if (item.hasOwnProperty(itemKey)) {
inner = item[itemKey];
out[idx].push(itemKey + '-' + inner.allMovement + '-' + inner.allLoad + '-' + inner.loadMovement);
}
}
}
}
console.log(out);
這是一個使用jQuery.each()函數的解決方案:
var convertedObj = {};
$.each(data, function(i0,val0) {
$.each(val0, function(i1,val1) {
$.each(val1, function(i2,val2) {
if (!convertedObj[i1+"-"+i2]) convertedObj[i1+"-"+i2] = [];
convertedObj[i1+"-"+i2].push(val2);
});
});
});
var convertedData = [];
$.each(convertedObj, function(i,val) {
convertedData.push(val);
});
(參見控制台中的結果)
使用underscore.js:
var memo = {};
_.each(data, function (elem) {
_.each(elem, function (elem2, idx) {
_.each (elem2, function(elem3, idx2) {
if (typeof memo[idx + idx2] === 'undefined')
memo[idx + idx2] = [];
memo[idx + idx2].push(elem3);
});
});
});
memo = _.map(memo, function(e) { return e; });
// printing
document.write('[');
_.each(memo, function (e, idx) {
document.write("[");
_.each(e, function(ie, iidx) {
if (typeof ie === 'string')
document.write('"' + ie + '"');
else
document.write(ie);
if (iidx != e.length - 1)
document.write(",");
});
document.write("]");
if (idx != memo.length - 1)
document.write(",");
});
document.write(']');
輸出是
[["1","7"],["2","8"],["3","9"],[4,"10"],[5,"11"],[6,"12"]]
jsbin鏈接 - > http://jsbin.com/ajemih/11
我認為你有混亂的輸入數據,因為它不符合類型的輸出。 除非它也是這個練習的一部分... :-)
PS。 據我所知,你想要文字,這就是為什么有這整篇文檔的部分。但是你可以跳過它,如果你不想打印它
MZ
演示: http : //jsfiddle.net/XvwkX/1/
我已經完成了2次傳遞,第1次傳遞是構造一個簡單的結果,它解析原始數據對象並創建數字作為鍵的字符串文字,第二次傳遞是用相應的值更新convertedData
var。
var easyResult = {};
//first pass
$.each(data, function (d, o1) { //date, object1
$.each (o1, function (t, o2) { //type, object2
$.each(o2, function (s, n) { //string, ID
easyResult[n] = t + '-' + s + '-' + d;
});
});
});
for (var i = 0; i < convertedData.length; i++ ) {
for (var j = 0; j < convertedData[i].length; j++) {
convertedData[i][j] = easyResult[""+convertedData[i][j]];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.