Обновлять / создавать свойства объекта динамически - PullRequest
1 голос
/ 18 ноября 2011

Я создаю функцию, которая предоставляет функции get () и set () для чтения и обновления значений из объекта JavaScript.Хитрость в том, что я использую строку с точечной нотацией для указания свойств.

У меня нормально работает get (), у меня проблемы с set ().

Пример данных:

var data = {
    person: {
        name: 'Fred',
        birthday: '19840101',
        address: {
            street: '123 Main St.',
            city: 'Anytown',
            state: 'NY',
            zip: '123123'
        },
        family: {
            spouse: 'Sally',
            children: ['Sam', 'Frank', 'Susan']
        }
    }
};

Функция get ():

function get (path) {
    var parts = path.split('.'),
        tmp = data;
    for (var i = 0, l = parts.length; i < l; ++i) {
        if (tmp[parts[i]]) {
            tmp = tmp[parts[i]];
        }
        else {
            tmp = null
            break;
        }
    }
    return tmp;
}

console.log(get('person.name')); // Fred
console.log(get('person.family.children')); // ['Sam', 'Frank', 'Susan']
console.log(get('person.jobs.apple')); // null

Функция set ():

var foo = null;
function set (path, val) {
    var parts = path.split('.')
        tmp = {},
        foo = data;

    for (var i = 0, l = parts.length; i < l; ++i) {
        if (tmp[parts[i]]) {
            tmp = data[parts[i]];
        }
        else {
            tmp = {};
        }
        if (i+1 === l) {
            tmp = val;
        }
        data[parts[i]] = tmp;
    }
}

set('person.name', 'Dave'); // replace existing name
set('person.family.children', ['Tim', 'Matt', 'Kathy']); // replace existing array
set('person.jobs.apple', 'developer'); // should create the necessary properties
console.log(data);

Я получаю следующий объект:

obj = {
    person: {},
    name: "Dave",
    family: {},
    children: ["Tim","Matt","Kathy"],
    jobs: {},
    apple: "developer"
}

Есть мысли о том, как этого добиться?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Для этого вам вообще не нужны никакие функции.

Смотрите это

var data = {
    person: {
        name: 'Fred',
        birthday: '19840101',
        address: {
            street: '123 Main St.',
            city: 'Anytown',
            state: 'NY',
            zip: '123123'
        },
        family: {
            spouse: 'Sally',
            children: ['Sam', 'Frank', 'Susan']
        }
    }
};

alert(data.person.name);
data['person']['name'] = 'Tim';
alert(data['person']['name']);

Существует также этот ответ, который может помочь

Кодирование значения ключа объекта Javascript. Динамическая установка вложенного значения

0 голосов
/ 18 ноября 2011

Похоже, ваша проблема заключается в данных [parts [i]] = tmp; в конце установленной функции.

0 голосов
/ 18 ноября 2011

Похоже, что в вашем коде set есть некоторые опечатки.

Строка tmp = data[parts[i]]; действительно должна быть tmp = tmp[parts[i]];. И затем вы, вероятно, захотите поместить это в новую переменную - скажем, newTmp, - чтобы потом можно было присвоить ее обратно в объект:

    tmp[parts[i]] = newTmp; 
    tmp = newTmp;
...