开发者

building a database string

开发者 https://www.devze.com 2023-02-22 05:17 出处:网络
I\'m trying to build a database based on some arbitrary data on a website. It\'s complex and changes for each site so I\'ll spare the details. Here\'s basically what I\'m trying to do

I'm trying to build a database based on some arbitrary data on a website. It's complex and changes for each site so I'll spare the details. Here's basically what I'm trying to do

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

And so on. The thing is some level1's don't have any children and I can't get the formatting right.

My three problems are as follows.

  1. The ending commas are going to break in IE (thank you MS)
  2. Empty level1's shouldn't be printed if they don't have any children
  3. Closing /curly?brackets/

HERE'S A DEMO of what I have so far. Notice the ending commas, the empty sub2 which shouldn't be printed, and no closing brackets or braces

Do I need to redesign the entire thing? Is there also a way to have this all in one function so I don't have to worry if I add another layer?

EDIT

This needs to be done in a string format, I can't build an object and then stringify it, 开发者_如何学编程mostly because I need to know which element I'm in the middle of adding to.


Overall it looks that you still might want to build an object, but in case you insist on not building it - here is some sample solution:

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();

You could see it in action here.


I'm not sure why you're building what looks like objects with nested arrays, using string concatenation. Something like this would be much simpler, since it wouldn't require fixing trailing commas, etc:

Edit: I've updated the code to make it keep track of the last level put in.

function Db() {
    var level0, level1;
    var data = new Object();

    this.level0 = function(arg) {
        level0 = new Object();
        data[arg] = level0;

    }
    this.level1 = function(arg) {
        level1 = new Array();
        level0[arg] = level1;
    }
    this.level2 = function(arg) {
        level1.push(arg);
    }

    this.toString = function() {
        var s = '';
        for(i in data) {
            s += i + '\n';
            for(j in data[i]) {
                if(data[i][j].length>0) {
                    s += '\t' + j + ': [' + data[i][j] + ']\n' ;
                }
            }
        }
        return s;
    }

}

Use like this:

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

I've tested this in the demo you linked and it works just fine.

0

精彩评论

暂无评论...
验证码 换一张
取 消