Javascript 基于NodeJS的动态对象遍历

Javascript 基于NodeJS的动态对象遍历,javascript,node.js,Javascript,Node.js,我有一个存储对象,其中包含一个对象数据存储,如下所示: data = { name1: 'value1', name2: 'value2', child: { name3: 'value3', name4: 'value4' } } update(data, 'name1', 'foobar'); 我需要做的是传递数据变量、名称和值,并更新对象,如下所示: data = { name1: 'value1', na

我有一个存储对象,其中包含一个对象数据存储,如下所示:

data = {
    name1: 'value1',
    name2: 'value2',
    child: {
        name3: 'value3',
        name4: 'value4'
    }
}
update(data, 'name1', 'foobar');
我需要做的是传递数据变量、名称和值,并更新对象,如下所示:

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;
}
所以问题是“field”包含新值,而“data.child.name3”不包含新值。如何遍历和更新主数据对象


关于如何解决这个问题有什么想法吗?

您已经重复了一个步骤。只需向后迭代一步即可获得对对象的引用,然后设置该对象的属性值:

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;
您想要做的(我在上面的代码中也是这么做的)是:


好的,我用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);
}

干得好。我想我试过了,但我想我做得不对。这很有效,而且比我的解决方案更好,因为它避免了eval()。谢谢一个小错误:我认为最后一行应该是
field[fieldNameParts.shift()]
,而不仅仅是
field[fieldNameParts]
。从技术上讲,你是对的。它仍然有效,因为带有1项的数组的字符串表示形式(由while确保)通常与该1项的字符串表示形式相同。我更新了我的答案,因为我不打算使用这样一个模糊的功能:),它只是一个无害的bug。如果我以前看到过,我可能会改用它。你考虑过使用
lodash.set