2013-03-09 57 views
3

我試圖將Javascript對象字面量轉換爲另一個對象字面量。我認爲這是可能的一些循環,但我無法完成。目標結構如下所示,「convertedData」。Javascript - 將大對象字面量轉換爲另一個對象字面量

小提琴可以在這裏找到: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"]]; 

*/ 
+0

您的jsFiddle不會爲我加載。另外,是的,你需要一個循環,大概是3. – Halcyon 2013-03-09 00:14:25

+0

大聲笑,我曾經有過這樣的面試問題。有一個設定深度還是理論上的深度是無限的?將採取幾個循環或遞歸 – jyore 2013-03-09 00:35:49

+0

深度就像在例子中,而不是在理論上是無限的。 – 2013-03-09 08:22:18

回答

2

這裏有一個解決方案,它的用途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); 
}); 

這裏是link to a jsbin fiddle

(在控制檯看到的結果)

4

嘗試這樣的事情,調整它,因爲你需要:

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); 
+0

Upvote。這是正確的方向,但它提供的不完全是我想要的。 – 2013-03-09 08:41:47

+0

我已經更新了小提琴馬克特利,請看看!這是正確的方向! – 2013-03-09 18:44:58

2

使用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。我瞭解你想要的文字,這就是爲什麼有這整個文件撰寫的部分,但你可以跳過OFC,如果你不想打印

MZ

2

DEMO:http://jsfiddle.net/XvwkX/1/

我第一遍是構造一個簡單的結果,它解析原始數據對象,並創建字符串文本,其中數字爲鍵,第二遍是用對應的值更新變量convertedData

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]]; 
    } 
}