2013-09-28 66 views
0

我遍歷了一堆物體看起來像這樣:的Javascript:從詳細的系列創建摘要Object對象

var tests = [{ date: 1379082017487, 
    summary: 
    {'Item A': 2069, 
    'Item B': 8987, 
    'Item C': 1890 
    }}, 
{date: 1379082015968, 
    summary: 
    {'Item A': 1824, 
    'Item B': 6758, 
    'Item C': 3857 
    }}]; 

我需要的數據相同的按鍵組合成一個單一的對象和包含組合值的數組:

{ date: [1379082017487, 1379082015968], 
    summary: 
    { 'Item A': [2069, 1824], 
    'Item B': [8987, 6758], 
    'Item C': [1890, 3857] 
    } 
} 

我到目前爲止的策略是創建一個嵌套循環;迭代頂層對象並將其值添加到「日期」數組中。然後遍歷'summary'對象,將這些值推送到表示每個鍵的數組。最後,我將數組重新組合在一起以形成單個輸出對象。

我的大腦凍結在內部陣列上。它可以有不同數量的鍵('項目')。儘管這些鍵在代碼的任何給定運行中都具有相同的名稱,但它們在運行之間可以有不同的名稱。內部循環不會產生數組(如[2069,1824])。

到目前爲止,我有:

var testDates = []; 
var itemVals = []; 
// iterate over the outer objects 
for (var record = 0; record < tests.length; record++) { 
    testDates.push(tests[record].date); // this works fine 

    // iterate over the inner 'summary' object: 
    for (var itemName in tests[record]['summary']) { 
     // doesn't produce the appropriate array 
     itemVals.push([tests[record]['summary'][itemName]]); 
    } 

} 

感謝您的諮詢!

回答

0

我已經爲您的問題寫了一個示例代碼。請試試這個,讓我知道它是否工作

var tests = [{ 
    date: 1379082017487, 
    summary: { 
    'Item A': 2069, 
    'Item B': 8987, 
    'Item C': 1890 
    } 
}, { 
    date: 1379082015968, 
    summary: { 
    'Item A': 1824, 
    'Item B': 6758, 
    'Item C': 3857 
    } 
}]; 
var json = { 
    date: [], 
    summary: {} 
}; 
for (var i = 0; i < tests.length; i++) { 
    var dateJSON = tests[i]; 
    json.date.push(dateJSON.date); 
    for (var key in dateJSON.summary) { 
    if (dateJSON.summary.hasOwnProperty(key)) { 
     if (json.summary[key] == null) { 
     json.summary[key] = []; 
     } 
     json.summary[key].push(dateJSON.summary[key]); 
    } 
    } 
} 
+0

這實際上是完美的。出於好奇,JSLint說「使用===與null比較」。當我爲'if(json.summary [key] === null)'這樣做時,'json.summary [key] .push(dateJSON.summary [key]);'行失敗並返回TypeError:Can not call method未定義「推」。任何想法爲什麼發生這種情況? – Fiona

+0

當我使用json.summary [key] === null時,它返回false,所以數組未被初始化,因此得到錯誤「無法調用未定義的'push'。如果我比較(json.summary [key] === undefined),那麼它會給我正確的結果,即true,並且數組被初始化。 – S4beR