javascript - HTML转成JSON数据

查看:100
本文介绍了javascript - HTML转成JSON数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

例如以下HTML

<tr class="jtable-row-even jtable-row-selected">
<td class="jtable-selecting-column">
<input type="checkbox" checked="checked"/>
</td>
<td class="">01010004</td>
<td class="">一次性注射器</td>
<td class="">10ml</td>
</tr>

要转换成 {"ID":"01010004","Name":"一次性注射器","Specification":"10ml"} 进行存储

有什么插件或者思路

补充如下:

HTML结构:

<!-- table -->
        <div id="businessData-filter-table" class="tableStyle-2">

            <!-- container -->
            <div class="tableStyle-2-container">

                <div id="bft-rootOperator" class="tableStyle-2-operator" operator="1">且</div>
                <div id="bft-rootContainer" class="tableStyle-2-content">

                    <div class="tableStyle-2-container">
                        <div class="tableStyle-2-operator" operator="2">或</div>
                        <div class="tableStyle-2-content">

                            <div class="tableStyle-2-container">
                                <div class="tableStyle-2-operator" operator="1">且</div>
                                <div class="tableStyle-2-content">
                                    <ul class="tableStyle-2-content-list">
                                        <li class="tableStyle-2-content-list-unitRow">
                                            <label class="unitRow-label">沈阳</label>
                                            <div class="unitRow-condition">
                                                <select name="unitRow-condition" class="select2 selectCondition">
                                                    <option value="1">属于</option>
                                                    <option value="2">不属于</option>
                                                    <option value="3" selected="selected">包含</option>
                                                    <option value="4">不包含</option>
                                                    <option value="5">为空</option>
                                                    <option value="6">非空</option>
                                                    <option value="7">开头是</option>
                                                    <option value="8">结尾是</option>
                                                </select>
                                            </div>
                                            <div class="unitRow-editRange">
                                                <input type="text" name="unitRow-editRange" class="editRange">
                                            </div>
                                            <div class="operationBar">
                                                <i class="add" action="addListUnitRowEditBox"></i>
                                                <i class="del" action="delListUnitRow"></i>
                                            </div>
                                        </li>
                                        <li class="tableStyle-2-content-list-unitRow">
                                            <label class="unitRow-label">重庆</label>
                                            <div class="unitRow-condition">
                                                <select name="unitRow-condition" class="select2 selectCondition">
                                                    <option value="1">属于</option>
                                                    <option value="2" selected="selected">不属于</option>
                                                    <option value="3">包含</option>
                                                    <option value="4">不包含</option>
                                                    <option value="5">为空</option>
                                                    <option value="6">非空</option>
                                                    <option value="7">开头是</option>
                                                    <option value="8">结尾是</option>
                                                </select>
                                            </div>
                                            <div class="unitRow-pickRange">
                                                <select name="unitRow-pickRange" class="select2 selectPickRange">
                                                    <option value="1" selected="selected">属于</option>
                                                    <option value="2">不属于</option>
                                                    <option value="3">包含</option>
                                                    <option value="4">不包含</option>
                                                    <option value="5">为空</option>
                                                    <option value="6">非空</option>
                                                    <option value="7">开头是</option>
                                                    <option value="8">结尾是</option>
                                                </select>
                                            </div>
                                            <div class="operationBar">
                                                <i class="add" action="addListUnitRowEditBox"></i>
                                                <i class="del" action="delListUnitRow"></i>
                                            </div>
                                        </li>
                                        <li class="tableStyle-2-content-list-unitRow">
                                            <label class="unitRow-label">西安</label>
                                            <div class="unitRow-condition">
                                                <select name="unitRow-condition" class="select2 selectCondition">
                                                    <option value="1" selected="selected">属于</option>
                                                    <option value="2">不属于</option>
                                                    <option value="3">包含</option>
                                                    <option value="4">不包含</option>
                                                    <option value="5">为空</option>
                                                    <option value="6">非空</option>
                                                    <option value="7">开头是</option>
                                                    <option value="8">结尾是</option>
                                                </select>
                                            </div>
                                            <div class="unitRow-pickRange">
                                                <select name="unitRow-pickRange" class="select2 selectPickRange">
                                                    <option value="1">属于</option>
                                                    <option value="2">不属于</option>
                                                    <option value="3">包含</option>
                                                    <option value="4">不包含</option>
                                                    <option value="5" selected="selected">为空</option>
                                                    <option value="6">非空</option>
                                                    <option value="7">开头是</option>
                                                    <option value="8">结尾是</option>
                                                </select>
                                            </div>
                                            <div class="operationBar">
                                                <i class="add" action="addListUnitRowEditBox"></i>
                                                <i class="del" action="delListUnitRow"></i>
                                            </div>
                                        </li>
                                    </ul>
                                </div>
                            </div>

                            <ul class="tableStyle-2-content-list">
                                <li class="tableStyle-2-content-list-unitRow">
                                    <label class="unitRow-label">广州</label>
                                    <div class="unitRow-condition">
                                        <select name="unitRow-condition" class="select2" style="width: 100%">
                                            <option value="1">属于</option>
                                            <option value="2">不属于</option>
                                            <option value="3">包含</option>
                                            <option value="4" selected="selected">不包含</option>
                                            <option value="5">为空</option>
                                            <option value="6">非空</option>
                                            <option value="7">开头是</option>
                                            <option value="8">结尾是</option>
                                        </select>
                                    </div>
                                    <div class="unitRow-pickRange">
                                        <select name="unitRow-pickRange" class="select2" style="width: 100%">
                                            <option value="1">属于</option>
                                            <option value="2">不属于</option>
                                            <option value="3">包含</option>
                                            <option value="4">不包含</option>
                                            <option value="5">为空</option>
                                            <option value="6">非空</option>
                                            <option value="7" selected="selected">开头是</option>
                                            <option value="8">结尾是</option>
                                        </select>
                                    </div>
                                    <div class="operationBar">
                                        <i class="add" action="addListUnitRowEditBox"></i>
                                        <i class="del" action="delListUnitRow"></i>
                                    </div>
                                </li>
                                <li class="tableStyle-2-content-list-unitRow">
                                    <label class="unitRow-label">深圳</label>
                                    <div class="unitRow-condition">
                                        <select name="unitRow-condition" class="select2" style="width: 100%">
                                            <option value="1">属于</option>
                                            <option value="2">不属于</option>
                                            <option value="3">包含</option>
                                            <option value="4">不包含</option>
                                            <option value="5">为空</option>
                                            <option value="6">非空</option>
                                            <option value="7">开头是</option>
                                            <option value="8" selected="selected">结尾是</option>
                                        </select>
                                    </div>
                                    <div class="unitRow-pickRange">
                                        <select name="unitRow-pickRange" class="select2" style="width: 100%">
                                            <option value="1">属于</option>
                                            <option value="2">不属于</option>
                                            <option value="3">包含</option>
                                            <option value="4">不包含</option>
                                            <option value="5" selected="selected">为空</option>
                                            <option value="6">非空</option>
                                            <option value="7">开头是</option>
                                            <option value="8">结尾是</option>
                                        </select>
                                    </div>
                                    <div class="operationBar">
                                        <i class="add" action="addListUnitRowEditBox"></i>
                                        <i class="del" action="delListUnitRow"></i>
                                    </div>
                                </li>
                            </ul>

                        </div>
                    </div>

                    <!-- container -->
                    <ul class="tableStyle-2-content-list">
                        <li class="tableStyle-2-content-list-unitRow">
                            <label class="unitRow-label">长春</label>
                            <div class="unitRow-condition">
                                <select name="unitRow-condition" class="select2" style="width: 100%">
                                    <option value="1">属于</option>
                                    <option value="2" selected="selected">不属于</option>
                                    <option value="3">包含</option>
                                    <option value="4">不包含</option>
                                    <option value="5">为空</option>
                                    <option value="6">非空</option>
                                    <option value="7">开头是</option>
                                    <option value="8">结尾是</option>
                                </select>
                            </div>
                            <div class="unitRow-pickRange">
                                <select name="unitRow-pickRange" class="select2" style="width: 100%">
                                    <option value="1">属于</option>
                                    <option value="2">不属于</option>
                                    <option value="3">包含</option>
                                    <option value="4">不包含</option>
                                    <option value="5" selected="selected">为空</option>
                                    <option value="6">非空</option>
                                    <option value="7">开头是</option>
                                    <option value="8">结尾是</option>
                                </select>
                            </div>
                            <div class="operationBar">
                                <i class="add" action="addListUnitRowEditBox"></i>
                                <i class="del" action="delListUnitRow"></i>
                            </div>
                        </li>
                        <li class="tableStyle-2-content-list-unitRow">
                            <label class="unitRow-label">上海</label>
                            <div class="unitRow-condition">
                                <select name="unitRow-condition" class="select2" style="width: 100%">
                                    <option value="1">属于</option>
                                    <option value="2">不属于</option>
                                    <option value="3" selected="selected">包含</option>
                                    <option value="4">不包含</option>
                                    <option value="5">为空</option>
                                    <option value="6">非空</option>
                                    <option value="7">开头是</option>
                                    <option value="8">结尾是</option>
                                </select>
                            </div>
                            <div class="unitRow-pickRange">
                                <select name="unitRow-pickRange" class="select2" style="width: 100%">
                                    <option value="1" selected="selected">属于</option>
                                    <option value="2">不属于</option>
                                    <option value="3">包含</option>
                                    <option value="4">不包含</option>
                                    <option value="5">为空</option>
                                    <option value="6">非空</option>
                                    <option value="7">开头是</option>
                                    <option value="8">结尾是</option>
                                </select>
                            </div>
                            <div class="operationBar">
                                <i class="add" action="addListUnitRowEditBox"></i>
                                <i class="del" action="delListUnitRow"></i>
                            </div>
                        </li>
                    </ul>

                </div>
            </div>
            <!-- container -->

        </div>
        <!-- table -->
        
        
        
        
        
        
        

JS方法如下:(采用jQuery)

function getFilterTableData(tableID) {

                var operatorMap = {
                    1: 'AND',
                    2: 'OR'
                };

                var conditionAndRangeMap = {

                    condition: function($obj) {
                        return $obj.children('select').val()
                    },

                    pickRange: function($obj) {
                        return {
                            val: $obj.children('select').val(),
                            mode: 'select'
                        }
                    },

                    editRange: function($obj) {
                        return {
                            val: $obj.children('input').val(),
                            mode: 'input'
                        }
                    },

                    nullRange: function($obj) {
                        return
                    }

                };

                var c = '.tableStyle-2-container',
                    h = '.tableStyle-2-operator',
                    b = '.tableStyle-2-content',
                    l = '.tableStyle-2-content-list',
                    li = '.tableStyle-2-content-list-unitRow',
                    label = '.unitRow-label';

                var result = {};

                var $start = $(tableID).children();

                var looper = function($c, data) {

                    var $unitH = $c.children(h), //操作符
                        $unitB = $c.children(b), //内容
                        $unitB_children = $unitB.children(); //内容子节点

                    //如果有操作符
                    if($unitH.length) {
                        data.type = operatorMap[$unitH.attr('operator')];
                    }

                    //存储子节点信息
                    data.children = [];

                    //如果内容有子节点
                    if($unitB_children.length) {

                        var $unitL = $unitB.children(l); //内容 - 列表
                        var $unitC = $unitB.children(c); //内容 - 容器

                        if($unitL.length) {

                            var children = [];
                            var $lis = $unitL.children(li);

                            for(var i = 0, length = $lis.length; i < length; i++) {

                                var $label = $lis.eq(i).children(label);

                                var $condition = $label.next();

                                var $range = $condition.next();

                                var unitRowData = $.extend({
                                    
                                    col: $label.text()
                                    
                                }, {
                                    rel: conditionAndRangeMap[$condition.attr('class').split('-')[1]]($condition),
                                    
                                }, conditionAndRangeMap[$range.attr('class').split('-')[1]]($range));

                                children.push(unitRowData);

                            }

                            data.children.push({
                                children: children
                            });
                        }

                        if($unitC.length) {

                            data.children.unshift({});

                            looper($unitC, data.children[0]);

                        }

                    }

                }

                looper($start, result);

                return result

            }

            var resultData = getFilterTableData('#businessData-filter-table');
            
            console.log(JSON.stringify(resultData));

解决方案

我觉得你这个数据给不得完整,因为你没给列头数据,从你的信息来看,我估计表格应该是这样的

ID Name Specification
01010004 一次性注射器 10ml

首先,你得找到列序号与表头(列名称)的关系

不喜欢写原生 DOM 操作,我用 jQuery 示例了

var columnMap = [];
$("table tr:first th").each(function(index) {
    var $td = $(this);
    columnMap[index] = $td.text();
});
// 因为第一列是 CheckBox,改其值为 "",以便后面取数据的时候忽略
columnMap[0] = "";

如果实在没有列头,也可以手工写一个映射关系出来

var columnMap = ["", "ID", "Name", "Specification"];

现在来遍历表格的每一行(除标题行),把每一行转换成一个对象

var data = [];
$("table tr:not(:first)").each(function() {
    data.push(convertToModel($(this)));
});

其中 convertToModel 用于把一个 tr 的 jQuery 对象转换成模型,那么这个函数该怎么写呢?

function convertToModel($tr) {
    var model = {};
    $("td", $tr).each(function(i) {
        var $td = $(this);
        var name= columnMap[i];
        if (name) { // 排除 ""
            model[name] = $td.text();
        }
    });
    return model;
}

最后是 jfiddle 上的示例

https://jsfiddle.net/w7rcuw8r/1/

如果你的表格不是用 <th> 而是用 <td> 来作为表头的单元格,那么注意改写对应的选择器。另外,如果表格像示例中那样通过 <thead><tbody> 来区分了列头和内容,选择器还可以优化。

这篇关于javascript - HTML转成JSON数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆