2013-12-17 37 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

有趣的模块,罗伯特。如果以前我会看到,我可能会用它来代替。 –