动态对象遍历与 NodeJS

Dynamic Object Traversing with NodeJS

本文关键字:NodeJS 遍历 对象 动态      更新时间:2023-09-26

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

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;

你想做的(我在上面的代码中所做的)是:

var field = data.child;
field.name3 = 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);
}