Javascript 使用递归属性迭代保留属性结构

Javascript 使用递归属性迭代保留属性结构,javascript,object,recursion,properties,Javascript,Object,Recursion,Properties,这段代码面临的问题是,它没有使用相同的结构来声明回调中的属性 例如,如果函数以options.foo.bar属性结束,则在回调中它将声明self.bar,但我希望它保留相同的结构,因此它应该是self.foo.bar 我怎样才能做到这一点 function forEachProperty(object, callback) { for (var property in object) { if (!object.hasOwnProperty(property)) {

这段代码面临的问题是,它没有使用相同的结构来声明回调中的属性

例如,如果函数以options.foo.bar属性结束,则在回调中它将声明self.bar,但我希望它保留相同的结构,因此它应该是self.foo.bar

我怎样才能做到这一点

function forEachProperty(object, callback) {
    for (var property in object) {
        if (!object.hasOwnProperty(property)) {
            continue;
        }

        if (object[property].constructor === Object) {
            this.forEachProperty(object[property], callback);
        } else {
            callback(object, property);
        }
    }
}

// Usage
forEachProperty(options, function (object, property) {
    if (property !== 'timeUrl' && property !== 'element') {
        self[property] = object[property];
    }
});
试试这个:

function forEachProperty(loc,object, callback) {
    for (var property in object) {
        if (!object.hasOwnProperty(property)) {
            continue;
        }

        if (object[property].constructor === Object) {
            if(loc[property]===undefined)loc[property]={};
            this.forEachProperty(loc[property],object[property], callback);
        } else {
            callback(loc,object, property);
        }
    }
}

var self={bar:{baz:999}};
var options={test:'hello world',bar:{foo:8}}

// Usage
forEachProperty(self,options, function (loc,object, property) {
    if (property !== 'timeUrl' && property !== 'element') {
        loc[property] = object[property];
    }
});

问题是,当我有一个对象var self={bar:'test',baz:'test'},并且options对象只有bar属性时,它只将bar属性设置为self,它还应该保留baz属性。在您的情况下,baz属性被删除,而只有bar属性被设置。在没有baz属性的情况下,如何从选项中保留baz属性声明loc[property]=object[property];应仅覆盖loc中的属性。因此,如果self有{bar:1,baz:2},并且传递给函数的options对象有{bar:999},那么self现在应该是{bar:999,baz:2},而不是{bar:999}。有点像将它们合并在一起。确保您正在检索自我,而不是选项。因为我试过了,得到了options={bar:999}和self={bar:999,baz:2},我认为只有当对象有2+层深时才会出现问题。如果选项为{bar:{foo:1;bar:2},baz:3},则bar.bar将消失。