我正在尝试根据网站上的某些任意数据构建数据库。这是复杂的,每个网站都有变化,所以我会省去细节。这基本上就是我要做的事情
function level0(arg) { textarea.innerHTML += arg + ' = {'; }
function level1(arg) { textarea.innerHTML += '\n\t' + arg + ': ['; }
function level2(arg) { textarea.innerHTML += arg + ', '; }
等等。事情是某些level1没有任何孩子,我无法正确格式化。
我的三个问题如下。
HERE'S A DEMO 到目前为止我所拥有的。注意结束逗号,不应打印的空sub2
,没有右括号或大括号
我需要重新设计整个事物吗? 还有一种方法可以将这一切都集中在一个功能中,所以如果我添加另一个图层,我不必担心吗?
修改
这需要以字符串格式完成,我无法构建一个对象然后对其进行字符串化,主要是因为我需要知道我正在添加哪个元素。
答案 0 :(得分:1)
总的来说,看起来你仍然可能想要构建一个对象,但是如果你坚持不构建它 - 这里有一些示例解决方案:
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();
您可以在行动here中看到它。
答案 1 :(得分:0)
我不确定为什么要使用字符串连接构建具有嵌套数组的对象。这样的事情会简单得多,因为它不需要修复尾随逗号等等:
编辑:我已更新代码,以便跟踪放入的最后一个级别。
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;
}
}
像这样使用:
var db = new Db();
db.level0('head');
db.level1('sub1');
db.level2('item1');db.level2('item2');db.level2('item3');
我已经在您链接的演示中对此进行了测试,它的工作正常。