Javascript动态更改对象值

Javascript动态更改对象值,javascript,object,Javascript,Object,我有一个这样的物体 var userobj = { user1: { firstName: 'abc', lastName: 'abc', age: 29, address: { company: { location: 'xyz', city: 'xyz', street: 'xyz',

我有一个这样的物体

var userobj = {
    user1: {
        firstName: 'abc',
        lastName: 'abc', 
        age: 29,
        address: {
            company: {
                location: 'xyz',
                city: 'xyz',
                street: 'xyz',
                city: 'xyz'
            },
            location: 'xyz',
            city: 'xyz',
            street: 'xyz',
            city: 'xyz'
        },
        payment: {
            visa: false,
            master: false,
            paypal: true
        },

    },

    user2: {
        firstName: 'abc',
        lastName: 'abc', 
        age: 29,
        address: {
            company: {
                location: 'xyz',
                city: 'xyz',
                street: 'xyz',
                city: 'xyz'
            },
            location: 'xyz',
            city: 'xyz',
            street: 'xyz',
            city: 'xyz'
        },
        payment: {
            visa: false,
            master: false,
            paypal: true
        }
    }
};
我想写一个函数来动态地改变数据,就像这样

function updateUserData(userName, key, value) {
    userobj[userName][key] = value;
}
仅当更改第一级关键点时,此选项才起作用

updateUserData('user1', 'firstName', 'David');
有人能告诉我如何更改功能,以便我也可以将键更改为其他级别吗?也许用数组作为参数?像这样

updateUserData('user1', ['address', 'company', 'location'], 'David');
函数updateUserData(用户名、键、值){
var obj=userobj[用户名];
对于(var i=0;i
函数updateUserData(用户名、键、值){
var obj=userobj[用户名];

对于(var i=0;i我所知道的设置嵌套属性的最简单方法是提供该属性的路径以及新值

一个简单的实现可以是:

function ObjectWrapper (obj) {
    this.object = obj;
    this.pattern = new RegExp(/^[[a-z\._]]+$/i);

    // set a property at the given path
    this.setPropertyValue = function (path, value) {
        if (this.pattern.test(path)) {
            eval('this.object.' + path + '=' + JSON.stringify(value));
        }else{
            throw new Error('Malformed property path');
        }
    }
}
用法:

var obj = {
    name: 'Bob',
    friends: {
        name: 'Joe'
    }
};

var wrapper = new ObjectWrapper(obj);
wrapper.setPropertyValue('friends.name', 'Rick');
var obj = {
    name: 'Bob',
    friends: {
        name: 'Joe'
    }
};

var wrapper = new ObjectWrapper(obj);
wrapper.setPropertyValue('friends.name', 'Rick');

我所知道的设置嵌套属性的最简单方法是提供该属性的路径和新值

一个简单的实现可以是:

function ObjectWrapper (obj) {
    this.object = obj;
    this.pattern = new RegExp(/^[[a-z\._]]+$/i);

    // set a property at the given path
    this.setPropertyValue = function (path, value) {
        if (this.pattern.test(path)) {
            eval('this.object.' + path + '=' + JSON.stringify(value));
        }else{
            throw new Error('Malformed property path');
        }
    }
}
用法:

var obj = {
    name: 'Bob',
    friends: {
        name: 'Joe'
    }
};

var wrapper = new ObjectWrapper(obj);
wrapper.setPropertyValue('friends.name', 'Rick');
var obj = {
    name: 'Bob',
    friends: {
        name: 'Joe'
    }
};

var wrapper = new ObjectWrapper(obj);
wrapper.setPropertyValue('friends.name', 'Rick');

该实现的正则表达式是错误的,现在它可以工作了

function ObjectWrapper(obj) {
  this.object = obj;
  this.pattern = new RegExp(/^[[a-z\._]+$/i);

  // set a property at the given path
  this.setPropertyValue = (path, value) => {
    if (this.pattern.test(path)) {
      eval('this.object.' + path + '=' + JSON.stringify(value));
    } else {
      throw new Error('Malformed property path');
    }
  };
}
用法:


该实现的正则表达式是错误的,现在它可以工作了

function ObjectWrapper(obj) {
  this.object = obj;
  this.pattern = new RegExp(/^[[a-z\._]+$/i);

  // set a property at the given path
  this.setPropertyValue = (path, value) => {
    if (this.pattern.test(path)) {
      eval('this.object.' + path + '=' + JSON.stringify(value));
    } else {
      throw new Error('Malformed property path');
    }
  };
}
用法: