2013-12-17 40 views
0

我有了在它的對象數據存儲的存儲對象,像這樣遍歷:動態物體的NodeJS

data = { 
    name1: 'value1', 
    name2: 'value2', 
    child: { 
     name3: 'value3', 
     name4: 'value4' 
    } 
} 

我需要做的是通過數據變量,名稱和價值,並有對象更新,就像這樣:

update(data, 'name1', 'foobar'); 

這工作得很好,但這裏的漁獲:我需要能夠發送點符號的名稱,並將它更新正確的子屬性。例如:

update(data, 'child.name3', 'foobar'); 

下面是我用做遍歷代碼:

function update(data, fieldName, value) { 
    var field = data 
    var fieldNameParts = fieldName.split('.'); 
    while (fieldNameParts.length) 
     field = field[fieldNameParts.shift()]; 
    field = (value === undefined) ? null : value; 
} 

所以問題是,「場」中包含了新的價值,但「data.child.name3 「 纔不是。如何遍歷和更新主數據對象?

關於如何解決這個問題的任何想法?

回答

1

你已經重複了一步太遠了。簡單地重複一個倒退得到一個對象的引用,然後設置對象的屬性值:

function update(data, fieldName, value) { 
    var field = data 
    var fieldNameParts = fieldName.split('.'); 
    while (fieldNameParts.length > 1) // changed number of iterations 
     field = field[fieldNameParts.shift()]; 
    field[fieldNameParts.shift()] = (value === undefined) ? null : value; // set value on property not on variable 
} 

你最初做的是什麼:

var field = data.child.name3; 
field = value; 

你想成爲什麼(我在上面的代碼中)是:

var field = data.child; 
field.name3 = value; 
+0

不錯的工作。我以爲我嘗試過,但我想我沒有做到正確。這工作,並且比我的解決方案更好,因爲它避免了eval()。謝謝! –

+0

一個小錯誤:我認爲最後一行應該是'field [fieldNameParts.shift()]'而不是'field [fieldNameParts]'... –

+0

你在技術上是正確的。它仍然有效,因爲具有1個項目的數組的字符串表示(由while確保)通常與該項目的字符串表示相同。我更新了我的答案,因爲這不是我的意圖,使用這種晦澀的功能:),這只是一個無害的錯誤。 – Tibos

0

好吧,我用eval()解決了這個問題。雖然這是一個解決方案,但我不確定它是最好的。任何額外的想法?

function update(data, fieldName, value) { 
    var evalStr = 'data'; 
    var fieldNameParts = fieldName.split('.'); 
    while (fieldNameParts.length) 
     evalStr += '[\'' + fieldNameParts.shift() + '\']'; 
    evalStr += ' = (value === undefined) ? null : value;'; 
    eval(evalStr); 
} 
+1

['useful-value'](https://npmjs.org/package/useful-value)? – robertklep

+0

有趣的模塊,羅伯特。如果以前我會看到,我可能會用它來代替。 –