2

私はこのようなオブジェクトを持っています

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
        }
    }
};

この Funtkion のようにデータを動的に変更する関数を書きたい

function updateUserData(userName, key, value) {
    userobj[userName][key] = value;
}

これは、最初のレベルのキーを変更する場合にのみ機能します

updateUserData('user1', 'firstName', 'David');

キーを他のレベルにも変更できるように機能を変更する方法を教えてもらえますか? おそらく配列をパラメーターとして使用していますか?このような

updateUserData('user1', ['address', 'company', 'location'], 'David');
4

3 に答える 3

5
function updateUserData(userName, keys, value) {
    var obj = userobj[userName];

    for(var i=0; i<keys.length-1; i++){
        obj = obj[keys[i]];
    }

    obj[keys[i]] = value;
}

http://jsfiddle.net/rPPK5/1/

于 2013-09-19T13:50:20.103 に答える
1

私が知っている入れ子になったプロパティを設定する最も簡単な方法は、そのプロパティへのパスに新しい値を指定することです。

簡単な実装は次のようになります。

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');
于 2013-09-19T13:58:45.190 に答える