javascript - 将分层 JSON 文件转换为分层 jQuery div

标签 javascript jquery html css json

我如何遍历两个父子关系(在简单的 ID PKEY 和 FKEY 上)JSON 文件并将它们显示为 div 列表:

  1. 分层 - 子/FKEY div 仅出现在父/PKEY div 下(显示为父-子-子、父-子-子-子等)
  2. 可扩展 - 这些子/FKEY div 是display:none,直到您单击父/PKEY div;即,当您使用 jQuery 的 $(panelID).slideToggle(speed) 方法
  3. 单击 PKEY div 时,元素出现/消失
  4. 如果父 div 或子 div 中的最后一个键值对存在并且具有 key="DEPRECATED",则能够使用单独的复选框 div 进行切换
  5. 可排序 - 开个玩笑

jQuery 为我提供了 parseJSON 和很酷的显示功能,作为返回,我给了它极其可怕的 JS 调试技能。

编辑:这是有问题的两个 JSON 文件:

types.json:

{"objtype":[{"NAME":"Animal","ID":"15","DEPRECATED":""},{"NAME":"Vegetable","ID":"8"},{"NAME":"Mineral","ID":"2","DEPRECATED":""}]}

objs.json:

{"objinstance":[{"DATEBOUGHT":"2014-08-26 00:00:00.0","OBJTYPEID":"8","OBJNAME":"Fruit salad consisting of oranges and mangoes","OBJID":"454","DATEEXPIRES":"2014-09-01 00:00:00.0","DEPRECATED":""},{"DATEBOUGHT":"2014-08-26 00:00:00.0","OBJTYPEID":"8","OBJNAME":"Spicy V-8 juice","OBJID":"499","DATEEXPIRES":"2015-01-02 00:00:00.0"},{"DATEBOUGHT":"2014-08-26 00:00:00.0","OBJTYPEID":"2","OBJNAME":"Rental agreement for new apartment","OBJID":"2885","DATEEXPIRES":"2015-08-25 00:00:00.0"},{"DATEBOUGHT":"2014-08-26 00:00:00.0","OBJTYPEID":"2","OBJNAME":"Salt","OBJID":"1033","DATEEXPIRES":"","DEPRECATED":""},{"DATEBOUGHT":"","OBJTYPEID":"15","OBJNAME":"Koko the Monkey","OBJID":"68","DATEEXPIRES":"","DEPRECATED":""},{"DATEBOUGHT":"","OBJTYPEID":"15","OBJNAME":"Bubbles the Clown","OBJID":"69","DATEEXPIRES":"","DEPRECATED":""}]}

最佳答案

这是一个非常简单的示例,说明如何根据 JSON 格式的数据生成 HTML 标记。

算法:

  1. 将 JSON 字符串解析为 Javascript 对象
  2. 迭代父数据
  3. 为每个父数据创建父div,并在其中添加所需的内容。
  4. 迭代子数据,搜索公共(public)id
  5. 对于每个匹配父id的子数据,创建子div,将需要的内容添加到其中,最后追加到父div
  6. 将父 div 附加到容器或主体
  7. 冲洗、起泡、重复
  8. 根据您的喜好创建 CSS 样式

.

演示 fiddle :http://jsfiddle.net/abhitalks/h3nbwc1f/

片段:

var typesString = '{"objtype":[{"NAME":"Animal","ID":"15","DEPRECATED":""},{"NAME":"Vegetable","ID":"8"},{"NAME":"Mineral","ID":"2","DEPRECATED":""}]}';
var objsString = '{"objinstance":[{"DATEBOUGHT":"2014-08-26 00:00:00.0","OBJTYPEID":"8","OBJNAME":"Fruit salad consisting of oranges and mangoes","OBJID":"454","DATEEXPIRES":"2014-09-01 00:00:00.0","DEPRECATED":""},{"DATEBOUGHT":"2014-08-26 00:00:00.0","OBJTYPEID":"8","OBJNAME":"Spicy V-8 juice","OBJID":"499","DATEEXPIRES":"2015-01-02 00:00:00.0"},{"DATEBOUGHT":"2014-08-26 00:00:00.0","OBJTYPEID":"2","OBJNAME":"Rental agreement for new apartment","OBJID":"2885","DATEEXPIRES":"2015-08-25 00:00:00.0"},{"DATEBOUGHT":"2014-08-26 00:00:00.0","OBJTYPEID":"2","OBJNAME":"Salt","OBJID":"1033","DATEEXPIRES":"","DEPRECATED":""},{"DATEBOUGHT":"","OBJTYPEID":"15","OBJNAME":"Koko the Monkey","OBJID":"68","DATEEXPIRES":"","DEPRECATED":""},{"DATEBOUGHT":"","OBJTYPEID":"15","OBJNAME":"Bubbles the Clown","OBJID":"69","DATEEXPIRES":"","DEPRECATED":""}]}';

var types = JSON.parse(typesString);
var objs = JSON.parse(objsString);

types.objtype.forEach(function(item, idx) {
    var $parent = $("<div class='parent' />");
    var $label = $("<label>").text(item.ID + ': ' + item.NAME).attr('for', 'c' + idx);
	var $input = $('<input type="checkbox">').attr('id', 'c' + idx);
	$parent.append($label);
    $parent.append($input);
    objs.objinstance.forEach(function(item2) {
        if (item2.OBJTYPEID == item.ID) {
            var $child = $("<div class='child' />");
            var txt2 = item2.OBJID + ': ' + item2.OBJNAME;
            $child.text(txt2);
            $parent.append($child);
        }
    });
    $("#wrap").append($parent);
});
div#wrap {
    font-family: helvetica, sans-serif;
    font-size: 17px;
}
div.parent {
    border: 1px solid blue;
    padding: 8px; margin: 4px;
}
div.child {
    border: 1px solid green;
    font-size: 15px;
    padding: 0px; margin: 0px;
    opacity: 0; height: 0px;
    transition: all 250ms;
}
label {
    cursor: pointer;
}
input[type=checkbox] {
    display: none;
}
input[type=checkbox]:checked  ~ div.child {
    padding: 8px; margin: 8px;
    opacity: 1; height: auto;    
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="wrap"></div>

关于javascript - 将分层 JSON 文件转换为分层 jQuery div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27120829/

相关文章:

javascript - 返回对象属性映射时的 jQuery.map 错误

ajax - 使用 AJAX (jQuery) 加载日期在 div 内无限滚动

html - 使图像适合div而不丢失CSS中的任何内容

javascript - 传单 map 出现在编辑器中,但不在现场

javascript - Node.js 响应异步数据

javascript - React 渲染不必要的组件

javascript - "A.fn.A.init {}"是什么意思?

javascript - 具有多个按钮的 jQuery 模态表单

javascript - 延迟 2 秒或网页 AJAX 调用后的后续点击

python - 抓取表仅返回 "tbody"而不是 tbody 的内容