построение строки базы данных - PullRequest
0 голосов
/ 05 апреля 2011

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

function level0(arg) { textarea.innerHTML += arg + ' = {'; }
function level1(arg) { textarea.innerHTML += '\n\t' + arg + ': ['; }
function level2(arg) { textarea.innerHTML += arg + ', '; }

И так далее.Дело в том, что у некоторых уровней 1 нет детей, и я не могу правильно отформатировать.

Мои три проблемы следующие.

  1. Конечные запятые будут ломатьсяв IE (спасибо MS)
  2. Пустые уровни 1 не должны печататься, если у них нет детей
  3. Закрывающие / фигурные скобки /

ЗДЕСЬ ДЕМО того, что у меня есть до сих пор.Обратите внимание на запятые, пустые sub2, которые не должны быть напечатаны, и без закрывающих скобок или скобок

Нужно ли перепроектировать всю вещь?Есть ли способ сделать все это в одной функции, поэтому мне не нужно беспокоиться, если я добавлю другой слой?

EDIT

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

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

В целом кажется, что вы все еще можете построить объект, но если вы настаиваете на том, чтобы не строить его, вот пример решения:

function Printer() {
    var result = '',
        lastLevel = null,
        close = {0:'\n}', 1:']', 2:''},
        delimiter = {0: ',\n', 1:',\n', 2:','};

    function closeLevel(level, noDelimiter) {
        if(lastLevel === null)
            return;
        var l = lastLevel, d = level == lastLevel;        
        while(l >= level) {
            result += close[l] + (l == level && !noDelimiter ? delimiter[l]:'');
            l--;
        }
    }

    this.level0 = function(arg) {
        closeLevel(0);
        result += arg + ' = {\n';
        lastLevel = 0;
    };

    this.level1 = function(arg) {
        closeLevel(1);
        result += '\t' + arg + ': [';
        lastLevel = 1;
    };

    this.level2 = function(arg) {
        closeLevel(2);
        result += arg;
        lastLevel = 2;
    };

    this.getResult = function() {
        closeLevel(lastLevel, true);
        return result;
    }
}



var p = new Printer();
p.level0('head');

p.level1('sub1');
p.level2('item1');p.level2('item2');p.level2('item3');
p.level1('sub2');
p.level1('sub3');
p.level2('newthing');
p.level0('head2');

document.getElementById('textarea').value = p.getResult();

Вы можете увидеть это в действии здесь .

0 голосов
/ 05 апреля 2011

Я не уверен, почему вы строите то, что выглядит как объекты с вложенными массивами, используя конкатенацию строк.Примерно так было бы намного проще, поскольку не требовалось исправлять запятые и т. Д .:

Редактировать: я обновил код, чтобы он отслеживал последний введенный уровень.1004 *

Используйте вот так:

var db = new Db();
db.level0('head');
db.level1('sub1');
db.level2('item1');db.level2('item2');db.level2('item3');

Я проверил это в демо, которое вы связали, и оно работает просто отлично.

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