我正在研究MongoDB的mapReduce腳本,但我陷入了一個相當初學JavaScript的問題:我無法構建嵌套對象的路徑。設置是這樣的:在reduce步驟中,我有一個包含所有可能屬性(和一些示例值)的嵌套對象。構建嵌套對象的路徑
var result = {
computers: {
total: 12,
servers: {
total: 2,
os: {
unix: 2,
windows: 0
}
},
clients: {
total: 10,
os: {
unix: 3,
windows: 7
}
}
}
}
從映射步驟我得到外來文檔類似如下:
var incoming = {
computers {
total: 1,
clients: {
total: 1,
os: {
windows: 1
}
}
}
}
傳入的文件是邏輯上的結果文檔的子集:元素的順序和可能的因素是相同的,他們只是不完整:一個可能只包含服務器數據,另一個可能只包含客戶端數據,第三個可能包含兩者等。
我想遍歷傳入文檔,併爲每個屬性添加它的值,以相應的適當ty在結果文件中。遞歸遍歷傳入文檔不是問題(我認爲),但構建路徑是。我想出了以下代碼:
var traverse = function(knots, path) {
for (var k in knots) {
if (knots[k] !== null && typeof(knots[k]) == "object") {
path = path[knots[k]];
traverse(knots[k], path);
}
else {
// do something to get rid of the root-level incoming object
var rest = incoming.computers;
result[rest][knots[k]] += incoming[rest][knots[k]];
}
}
};
traverse(incoming.computers, incoming.computers);
此腳本不起作用。我懷疑我嘗試連接路徑(第4行)並將它傳遞給加法運算符(第7行)的方式都被破壞了。
MongoDB響應「16722 TypeError:無法讀取未定義的屬性'1',但我不明白這一點。
編輯:改變了上面的代碼:現在用對象調用traverse [path](遵循Felix的提示)。後續問題是我不知道在else子句中構造路徑時如何擺脫'傳入'根對象。 似乎沒有辦法。至少MongoDB仍然與上面的錯誤相同。
「路徑」的值究竟應該在哪一個中間步驟? –
@FelixKling:你的意思是第4行?在我使用修改後的路徑遞歸調用函數之前,我將當前結添加到「路徑」。 –
但'path'是一個字符串。你認爲訪問'path'中字符串的屬性'knots'會返回什麼結果? –