Создание объектов неизвестного размера НЕ используя eval - PullRequest
0 голосов
/ 07 марта 2011

В настоящее время я использую javascript eval () для проверки и создания многомерного объекта, о котором я понятия не имею, о глубине.

По сути, я хочу знать, есть ли способ создать этот объект с несколькими глубинами. Объект может быть настолько глубоким, как result['one']['two']['three']['four']['five']['six']['seven']. Я знаю, что есть случаи, когда использование eval () прекрасно, но я также беспокоюсь о производительности. Я думал о ссылке каждой глубины на новую переменную, но я не знаю, как делать указатели в Javascript

      create = function(fields, create_array){
        var field;

        for (j = 0; j < len; j++){
          field = fields.slice(0, j).join('');
          if (field){
            // is there any way to do this without eval?
            eval('if (typeof result' + field + ' == "undefined" || !result' + field + ') result' + field + ' = ' + (create_array?'[]':'{}') + ';');
          }
        }
      }

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Как насчет

var deep = { one: { two: { three: { four: { five: { six: { seven: 'peek-a-boo!' }}}}}}};

Я не понимаю, что "eval ()" вообще имеет к этому отношение;нет причины «инициализировать» такой объект.Просто создайте их.

Если вы хотите написать функцию с API, как у вас (по причинам, которые я не понимаю), вы можете сделать это:

function create(fields, create_array) {
  var rv = create_array ? [] : {}, o = rv;

  for (var i = 0; i < fields.length; ++i) {
    o = o[fields[i]] = create_array ? [] : {};
  }

  return rv;
}

Тампохоже, нет никакого смысла в флаге «create_array», так как вы, вероятно, всегда используете строки для ключей.

0 голосов
/ 07 марта 2011

Не бери в голову, нашёл свой путь. Я использовал рекурсивную функцию, чтобы убедиться, что объект был создан правильно.

      create = function(create_array, res, path){
        var field = fields.shift();

        if (field){ 
          if (typeof res[field] == "undefined" || !res[field]) res[field] = (create_array?[]:{});
          path.push('["' + field + '"]');
          create(create_array, res[field], path);
        }
      }

      var result = {}, strpath = [], fields[];
      create(true, result, strpath);
      eval('result' + strpath.join('') + ' = value;');

- переменная «field» - переменная вне функции, которая содержит уровни объекта.выполнение result["field"]["name"]["first"] = value без поля ["field"] или ["name"], существующего или определенного как объект, вызовет ошибку и остановит выполнение, поэтому я предварительно создаю переменную объекта в виде массива или объекта.*

Я не смог найти другой вариант для второго eval ().Нет способа обеспечить доступ к нескольким свойствам объекта, не зная глубины.

...