Javascript 将无效HTML表解析为JSON

Javascript 将无效HTML表解析为JSON,javascript,Javascript,我正在尝试构建一个Chrome扩展(其目的是,该扩展读取一个编码和格式错误的表,生成一个JSON,并用JSON生成的更干净、更漂亮的表替换该表)。表/脚本如下所示(它们是可执行的) 函数数组化(集合){ 返回Array.prototype.slice.call(collection); } 功能工厂(标题){ 返回函数(行){ 返回arrayify(行单元格)。reduce(函数(上、当前、i){ prev[headers[i]=curr.innerHTML; 返回上一个; }, {}); }

我正在尝试构建一个Chrome扩展(其目的是,该扩展读取一个编码和格式错误的表,生成一个JSON,并用JSON生成的更干净、更漂亮的表替换该表)。表/脚本如下所示(它们是可执行的)

函数数组化(集合){
返回Array.prototype.slice.call(collection);
}
功能工厂(标题){
返回函数(行){
返回arrayify(行单元格)。reduce(函数(上、当前、i){
prev[headers[i]=curr.innerHTML;
返回上一个;
}, {});
}
}
函数解析表(表){
var headings=arrayify(table.tHead.rows[0].cells).map(函数(标题){
返回heading.innerHTML;
});
返回arrayify(table.tBodies[0].rows.map(工厂(标题));
}
var table=document.querySelector(“表”);
var数据=分析表(表);
控制台日志(数据)

吃草
吃鱼
吃肉
喝酒
动物
母牛
哺乳动物
鲸鱼
第51区外国人

好的,您可能需要添加一些小调整,但我得到了一些东西:

var json_result = [];

var tds = document.querySelectorAll('td');
var ths = document.querySelectorAll('th');
var current_section = '';
var current_subsection = '';
var current_col = 0;

for(j in tds){
    if(typeof tds[j].innerHTML !== "undefined"){
        if(tds[j].innerHTML.indexOf('<input') > -1){
            // checked box
            json_result[current_section][current_subsection].push(ths[current_col+2].innerHTML);
            current_col++;
        }
        else{
            if(tds[j].innerHTML.indexOf('            ') == -1){
                if(tds[j].attributes.rowspan){
                    //section
                    current_section = tds[j].innerHTML;
                    json_result[current_section] = [];

                }
                else{
                    //subsection
                    current_subsection = tds[j].innerHTML;
                    json_result[current_section][current_subsection] = [];
                    current_col = 0;
                }
            }
            else{
                current_col++;
            }
        } 
    } 
}
console.log(json_result);

应该有一个
来放入这些
中。不要阅读HTML,而只是从数据中创建所需的对象。然后,它将不得不在更改后重新读取。只根据需要更新对象属性。为什么要费心“数组化”而不是仅仅使用DOM树API呢?您只需获取表和
HTMLElement。children
已经是元素子元素的数组,因此您似乎可以这样做。@melpomene请运行代码段-输出在控制台中。目标模式是我在问题末尾制作的树形图。公平地说,您的代码已经假设表是有效的HTML,THEAD包含一组标题,TBODY包含一组行,所以您至少可以免费获得所有这些。您可以发布更长的示例表吗?您可以打印它吗?每次我尝试返回一个
[]
数组。这很奇怪,当我在代码段编辑器中尝试时,我得到了[],但在chrome中,一个简单的html文件具有完全相同的代码,我在回答中得到了输出“漂亮地打印它”到底是什么意思?我尝试了所有的技巧(比如将
[]
更改为
{}
)-似乎JSON格式不正确,或者我搞错了。
{
    "": {
        "Grass Eater": [
            "Grass Eater"
        ]
    },
    "Animal": {
        "Cow": [
            "Grass Eater",
            "Plant Eater",
            "Singer",
            "Wings"
        ],
        "Platypus": [
            "Grass Eater",
            "Plant Eater",
            "Water Drinker",
            "Singer",
            "Wings"
        ],
        "Horse": [
            "Grass Eater",
            "Plant Eater",
            "Singer",
            "Wings"
        ],
        "Alien": [
            "Grass Eater",
            "Plant Eater",
            "Singer"
        ],
        "Doggo": [
            "Grass Eater",
            "Plant Eater",
            "Singer"
        ],
        "Dragon": [
            "Grass Eater",
            "Plant Eater",
            "Singer"
        ],
        "Horse Cart": [
            "Grass Eater",
            "Plant Eater",
            "Singer"
        ],
        "Alligator": [
            "Grass Eater",
            "Plant Eater"
        ]
    },
    "Mammal": {
        "Cow": [
            "Grass Eater",
            "Plant Eater",
            "Singer",
            "Dancer",
            "Someone",
            "Wings"
        ],
        "Platypus": [
            "Grass Eater",
            "Plant Eater",
            "Water Drinker",
            "Singer",
            "Dancer",
            "Someone",
            "LSleepyerally",
            "Running",
            "Out",
            "Of",
            "Now",
            "Vegan",
            "Sausage",
            "Cheese",
            "Nugget",
            "Wings",
            "Foodie",
            "Hoodie",
            "Finished",
            ""
        ],
        "Horse": [
            "Grass Eater",
            "Plant Eater",
            "Singer",
            "Dancer",
            "Someone",
            "Wings"
        ],
        "Alien": [
            "Grass Eater",
            "Plant Eater",
            "Singer",
            "Dancer"
        ],
        "Doggo": [
            "Grass Eater",
            "Plant Eater",
            "Singer",
            "Dancer"
        ],
        "Dragon": [
            "Grass Eater",
            "Plant Eater",
            "Dancer"
        ],
        "Horse Cart": [
            "Grass Eater",
            "Plant Eater"
        ],
        "Alligator": [
            "Grass Eater",
            "Plant Eater"
        ]
    },
    "Marsupial": {
        "Cow": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Singer"
        ],
        "Platypus": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Water Drinker",
            "Singer"
        ],
        "Horse": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Singer"
        ],
        "Alien": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Singer"
        ],
        "Doggo": [
            "Grass Eater",
            "Plant Eater",
            "Singer"
        ],
        "Dragon": [
            "Grass Eater"
        ],
        "Horse Cart": [
            "Grass Eater",
            "Plant Eater"
        ],
        "Alligator": [
            "Grass Eater"
        ]
    },
    "Sleepy Mammal": {
        "Cow": [
            "Grass Eater",
            "Fish Eater",
            "Singer",
            "Words",
            "Hoodie"
        ],
        "Platypus": [
            "Grass Eater",
            "Fish Eater",
            "Water Drinker",
            "Singer",
            "Words",
            "Hoodie"
        ],
        "Horse": [
            "Grass Eater",
            "Fish Eater",
            "Singer",
            "Words",
            "Hoodie"
        ],
        "Alien": [
            "Grass Eater",
            "Fish Eater",
            "Singer"
        ],
        "Doggo": [
            "Grass Eater",
            "Fish Eater",
            "Singer",
            "Words",
            "Hoodie"
        ],
        "Dragon": [
            "Grass Eater",
            "Fish Eater",
            "Words",
            "Hoodie"
        ],
        "Horse Cart": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater"
        ],
        "Alligator": [
            "Grass Eater",
            "Fish Eater"
        ]
    },
    "Squsihy": {
        "Cow": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Singer"
        ],
        "Platypus": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Water Drinker",
            "Singer"
        ],
        "Horse": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Singer"
        ],
        "Alien": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Singer"
        ],
        "Doggo": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater",
            "Singer"
        ],
        "Dragon": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater"
        ],
        "Horse Cart": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater"
        ],
        "Alligator": [
            "Grass Eater",
            "Plant Eater",
            "Fish Eater"
        ]
    },
    "Plushies": {
        "Cow": [
            "Grass Eater",
            "Plant Eater",
            "Singer",
            "Someone",
            "Running",
            "Out",
            "Of",
            "Fake"
        ],
        "Platypus": [
            "Grass Eater",
            "Plant Eater",
            "Water Drinker",
            "Oil Drinker",
            "Milk Drinker",
            "Singer",
            "Someone",
            "LSleepyerally",
            "Running",
            "Out",
            "Of",
            "Fake",
            "Words",
            "Now",
            "Vegan",
            "Sausage",
            "Cheese",
            "Nugget",
            "Wings",
            "Foodie",
            "Hoodie",
            "Finished",
            ""
        ],
        "Horse": [
            "Grass Eater",
            "Plant Eater",
            "Oil Drinker",
            "Milk Drinker",
            "Singer",
            "Someone",
            "LSleepyerally",
            "Running",
            "Out",
            "Of",
            "Fake",
            "Words",
            "Now",
            "Vegan",
            "Sausage",
            "Cheese",
            "Nugget",
            "Wings",
            "Foodie",
            "Hoodie",
            "Finished",
            ""
        ],
        "Alien": [
            "Grass Eater",
            "Plant Eater"
        ]
    }
}