Инициализация «многомерного» объекта в JavaScript - PullRequest
1 голос
/ 09 октября 2011

У меня возникла проблема с попыткой заполнить многомерный объект в javascript до того, как будут определены все измерения.

Например, вот что я хочу сделать:

var multiVar = {};
var levelone = 'one';
var leveltwo = 'two';

multiVar[levelone][leveltwo]['levelthree'] = 'test'

Было бы крайне обременительно создавать каждое измерение с такой строкой:

var multiVar = {};

multiVar['levelone'] = {};
multiVar['levelone']['leveltwo'] = {};
multiVar['levelone']['leveltwo']['levelthree'] = 'test'

Причина, по которой мне нужно сделать это без итеративного заполнения, заключается в том, что я не знаю, сколько будет измерений и какие у него будут ключи. Это должно быть динамично.

Есть ли способ сделать это динамически?

1 Ответ

3 голосов
/ 09 октября 2011

Вы могли бы написать функцию, которая обеспечивает существование необходимых «измерений», но вы не сможете использовать точечную или скобочную запись, чтобы получить эту безопасность.Примерно так:

function setPropertySafe(obj)
{
    function isObject(o)
    {
        if (o === null) return false;
        var type = typeof o;
        return type === 'object' || type === 'function';
    }

    if (!isObject(obj)) return;

    var prop;
    for (var i=1; i < arguments.length-1; i++)
    {
        prop = arguments[i];
        if (!isObject(obj[prop])) obj[prop] = {};
        if (i < arguments.length-2) obj = obj[prop];
    }

    obj[prop] = arguments[i];
}

Пример использования:

var multiVar = {};
setPropertySafe(multiVar, 'levelone', 'leveltwo', 'levelthree', 'test');
/*
multiVar = {
    levelone: {
        leveltwo: {
            levelthree: "test"
        }
    }
}
*/
...