2016-01-06 44 views
-2

我想寫一個JavaScript循環從此改變我的JavaScript對象,環路改造JavaScript對象

var d = { 
     "time_completed": 1420199657, 
     "xid": "-dqAeAEjGxCDcjqrxHsraER3yWqew4xS", 
     "title": "for 8h 46m", 
     "time_created": 1420167382, 
     "time_updated": 1420200033, 
     "details": { 
     "body": 0, 
     "sound": 12598, 
     "tz": "America/Chicago", 
     "awakenings": 0, 
     "light": 18970, 
     "mind": 0, 
     "asleep_time": 1420168079, 
     "awake_time": 1420199400, 
     "awake": 707, 
     "rem": 0, 
     "duration": 32275, 
     "smart_alarm_fire": 1420199640, 
     "quality": 100, 
     "sunset": 0, 
     "sunrise": 0 
     }, 
     "date": 20150102, 
     "shared": true, 
     "snapshot_image": "/nudge/image/e/1420200033/-dqAeAEjGxCDcjqrxHsraER3yWqew4xS/MSh0lOvjHDY.png", 
     "sub_type": 0 
    }; 

此,

var d = {"sleep":[ 
    {"time_completed":"time_completed"}, 
    {"xid":"xid"}, 
    {"title":"title"}, 
    {"time_created":"time_created"}, 
    {"time_updated":"time_updated"}, 
    {"details": [ 
    {"body":"body"}, 
    {"sound":"sound"}, 
    {"tz":"tz"}, 
    {"awakenings":"awakenings"}, 
    {"light":"light"}, 
    {"mind":"mind"}, 
    {"asleep_time":"asleep_time"}, 
    {"awake_time":"awake_time"}, 
    {"awake":"awake"}, 
    {"rem":"rem"}, 
    {"duration":"duration"}, 
    {"smart_alarm_fire":"smart_alarm_fire"}, 
    {"quality":"quality"}, 
    {"sunset":"sunset"}, 
    {"sunrise":"sunrise"} 
    ]}, 
    {"date":"date"}, 
    {"shared":"shared"}, 
    {"snapshot_image":"snapshot_image"}, 
    {"sub_type":"sub_type"} 
]}; 

d對象不會總是有相同的元素(鍵)或深度(兒童)。所以我試圖想出一個簡單的循環來提取JavaScript對象的結構(鍵和子元素)。有人可以爲我提供解決方案嗎?

+1

你有試過嗎?告訴我們你到底做了什麼以實現你的目標。 – juliobetta

+0

爲什麼你想要改變你的對象? – MinusFour

+0

這裏沒有JSON。這是一個普通的舊JavaScript對象。 – 2016-01-06 18:20:27

回答

0

您可以使用Object.keys()和遞歸通過你的(嵌套)對象屬性進行迭代,並Array.prototype.map()把它轉換:

function mapKeys(obj) { 
    return Object.keys(obj).map(function(key) { 
     var newObj = {}; 
     newObj[key] = (typeof obj[key] === 'object') ? mapKeys(obj[key]) : key; 
     return newObj; 
    }); 
} 

var result = { 
    sleep: mapKeys(d) 
}; 

console.log(result); 
+0

我真的不喜歡勺子喂碼的想法。 – 2016-01-06 18:12:06

+0

這取決於。有人可以複製粘貼它,有人可以通過分析代碼來學習。 – madox2

+0

這確實是一種理論上的可能性,儘管OP無法編寫for循環對於他從使用Object.keys的解決方案學習某些東西來說並不是很好,但它使用'map'等高階函數和三元運算符。我只是想知道,命運是否會繼續成爲人們提出的問題,他們不知道如何解決問題以及其他人爲他們編寫代碼。 – 2016-01-06 18:25:14

1

簡單的解決方案:

var transformed = {}; 

function transform(obj){ 
    var arr = [], prop, inner_obj; 
    for(prop in obj){ 
     inner_obj = {}; 
     inner_obj[prop] = (typeof obj[prop] === 'object')? transform(obj[prop]) : obj[prop]; 
     arr.push(inner_obj); 
    } 
    return arr; 
} 

transformed['sleep'] = transform(d); 
console.log(transformed); 
0

你應該用英文寫下你想要做的事情。它可能看起來像這樣:

  1. 創建一個新數組來保存結果。
  2. 遍歷對象的所有屬性。
  3. 對於每個屬性,創建一個小對象,其唯一鍵值對具有屬性名稱的鍵和值。將這個小對象添加到新數組中。
  4. 除了,如果屬性有一個對象作爲它的值,重複這個子對象的整個過程。
  5. 與單個sleep屬性的新陣列作爲它的值創建一個結果對象。

現在,你必須弄清楚如何做到每一步。例如,對於第二步,您需要知道如何查找對象的所有屬性。你知道怎麼做嗎?你可以谷歌「獲得一個javascript對象的所有屬性」。你會發現有一種叫做Object.keys()的東西。然後,你需要循環這些鍵。如果你不知道如何做到這一點,那麼有一個很好的新教程,上升到here。通讀這將是一個好主意。

如何添加一個鍵值對的一個對象?這是非常基礎的,並且在教程中也有介紹:new_object[key] = key

由於第4步是有點困難,跳過它在你的第一次迭代,並且讓你的程序只用嵌套的單級工作。

如果您在執行此操作時遇到麻煩,您將需要調試您的程序。關於該主題有一個很好的教程here

繼續過程中的剩餘步驟,直到你有一個正常運作的JS程序。