Строка Javascript для ссылки на объект (без eval () или индексов) - PullRequest
4 голосов
/ 13 апреля 2011

Я видел довольно много похожих вопросов и результатов Google, но ни один из них не соответствует моей проблеме.

Я получаю строку "header.h2", которую я хочу обозначить как 'var objects».Поэтому я хочу objects.header.h2 (который содержит больше хеш-данных).

Однако я не хочу использовать eval () или часто предлагаемый buttons[] по очевидной причине, что buttons[header.h2] выиграл 'не работает, и мне нужно было бы buttons[header][h2].

Так как же мне сохранить обозначение объекта или, в худшем случае, решить мою проблему?

Ответы [ 2 ]

8 голосов
/ 13 апреля 2011

Просто быстрый набросок возможного пути:

Ваши данные :

var data = [
    {foo: 1, bar: 2, foobar: [
        'a', 'b', 'c'
    ]},
    {foo: 1, bar: 2, foobar: [
        'd', 'e', 'f'
    ]},
    {foo: 1, bar: 2, foobar: [
        'g', 'h', 'i'
    ]}
];

var accessor = '1.foobar.2';

Использование вспомогательной функции :

function helper(data, accessor) {
    var keys = accessor.split('.'),
        result = data;

    while (keys.length > 0) {
        var key = keys.shift();
        if (typeof result[key] !== 'undefined') {
            result = result[key];
        }
        else {
            result = null;
            break;
        }
    }

    return result;
}

Или сделать его доступным для всех объектов : (лично мне это не нравится ...)

Object.prototype.access = function (accessor) {
    var keys = accessor.split('.'),
        result = this;

    while (keys.length > 0) {
        var key = keys.shift();
        if (typeof result[key] !== 'undefined') {
            result = result[key];
        }
        else {
            result = null;
            break;
        }
    }

    return result;
};

Отладочный вывод :

console.log(
    helper(data, accessor), // will return 'f'
    data.access(accessor) // will return 'f'
); 
3 голосов
/ 13 апреля 2011

Я бы создал метод "заполнить", который создает объект в соответствии со строкой нотации:

var populate = function(obj, str) {
  var ss=str.split(/\./), len=ss.length, i, o=obj;
  for (i=0; i<len; i++) {
    if (!o[ss[i]]) { o[ss[i]] = {}; }
    o = o[ss[i]];
  }
  return obj;
};

var objects = populate({}, 'header.h2');
objects.header.h2; // => Object {}
populate(objects, 'foo.bar.gah.zip');
objects.foo.bar.gah.zip; // => Object {}

Требуется тестирование, но должно приблизить вас к вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...