首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自JS中嵌套列表项的多维数组或json对象

来自JS中嵌套列表项的多维数组或json对象
EN

Stack Overflow用户
提问于 2016-11-15 07:10:04
回答 2查看 289关注 0票数 0

我有一个嵌套的列表项。我想从列表项中创建一个多维数组或json对象。我试过像下面这样的东西。但我没有得到预期的产出。

列表项的深度可以更多。因此,我将在以后定义一个递归方法来完成这个任务。

演示Fiddle

HTML:

代码语言:javascript
复制
<div class="dd" id="nestable">
    <ol class="dd-list">
        <li class="dd-item" data-id="1">
            <div class="dd-handle">Sub-indicator 1</div>
            <ol class="dd-list">
                <li class="dd-item" data-id="2">                    
                    <div class="dd-handle">Sub-indicator 2</div>
                    <ol class="dd-list">
                        <li class="dd-item" data-id="3">

                            <div class="dd-handle">Sub-indicator 3</div>
                            <ol class="dd-list">
                                <li class="dd-item" data-id="4">

                                    <div class="dd-handle">Sub-indicator 4</div>
                                </li>
                            </ol>
                        </li>
                    </ol>
                </li>
                <li class="dd-item" data-id="3">

                            <div class="dd-handle">Sub-indicator 3</div>
                            <ol class="dd-list">
                                <li class="dd-item" data-id="4">

                                    <div class="dd-handle">Sub-indicator 4</div>
                                </li>
                            </ol>
                        </li>
            </ol>
        </li>
    </ol>
</div>

联署材料:

代码语言:javascript
复制
var subIndicTreeObj = {};
var tempObj = [];
var parentId = 0;
var parentId1 = 0;
var parentId2 = 0;

$('#nestable > ol > li').each(function(index, value) { 
    parentId = 0;
    parentId1 = 0;
    parentId2 = 0;

    tempObj.push({'sub_indic_id': $(this).attr('data-id'), 'parent_id': parentId});


    if ($(this).has('ol').length > 0) { 

        parentId = $(this).attr('data-id');

        $(this).find('ol > li').each(function(index1, value1) { 

            tempObj.push({'sub_indic_id': $(this).attr('data-id'), 'parent_id': parentId});


            if ($(this).has('ol').length > 0) {  

                parentId1 = $(this).attr('data-id');

                $(this).find('ol > li').each(function(index2, value2) { 

                    tempObj.push({'sub_indic_id': $(this).attr('data-id'), 'parent_id': parentId1});

                    if ($(this).has('ol').length > 0) { 


                        parentId2 = $(this).attr('data-id');

                        $(this).find('ol > li').each(function(index3, value3) { 

                            tempObj.push({'sub_indic_id': $(this).attr('data-id'), 'parent_id': parentId2});

                        });
                    }

                });
            } 
        });
    } 
});

subIndicTreeObj = tempObj;

console.log(subIndicTreeObj);

当前产出:

代码语言:javascript
复制
 [
  Object{
    sub_indic_id="1",
    parent_id=0
  },
  Object{
    sub_indic_id="2",
    parent_id="1"
  },
  Object{
    sub_indic_id="3",
    parent_id="2"
  },
  Object{
    sub_indic_id="4",
    parent_id="3"
  },
  Object{
    sub_indic_id="4",
    parent_id="2"
  },
  Object{
    sub_indic_id="3",
    parent_id="1"
  },
  Object{
    sub_indic_id="4",
    parent_id="3"
  },
  Object{
    sub_indic_id="4",
    parent_id="1"
  },
  Object{
    sub_indic_id="3",
    parent_id="1"
  },
  Object{
    sub_indic_id="4",
    parent_id="3"
  },
  Object{
    sub_indic_id="4",
    parent_id="1"
  }
]

我想要一个孩子的parent_id。但是我得到了一些列表项目的顶级parent_id。比如,

代码语言:javascript
复制
Object{
    sub_indic_id="4",
    parent_id="1"
  }

有人能帮忙找出这个问题吗?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-15 07:28:11

我不明白这是否是预期的行为,无论如何,它是递归的,而且也找到了第一个孩子。我只是在>选择器之前添加了一个ol > li

注意,我还向data-id='0'添加了一个id="nestable",以获得第一个父id。

编辑

有关注释中询问的>选择器的更多细节,我建议查看一些文档。我主要是从w3school那里学到的。从该链接报告

element>element选择器用于选择具有特定父元素的元素。

因此,在用ol > li编写的代码中,您检索了包含在$(this)中的每个ol的所有的li子级。

使用> ol > li,您可以检索您正在搜索的对象的直接子对象,而不是孩子的孩子。

代码语言:javascript
复制
var subIndicTreeObj = [];

function findLiChild($obj, parentId) {
  $obj.find('> ol > li').each(function(index1, value1) {
    subIndicTreeObj.push({
      'sub_indic_id': $(this).attr('data-id'),
      'parent_id': parentId
    });

    findOlChild($(this));
  });
}

function findOlChild($obj) {
  if ($obj.has('ol').length > 0) {
    findLiChild($obj, $obj.attr('data-id'));
  }
}

findOlChild($('#nestable'));

console.log(subIndicTreeObj);
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="dd" id="nestable" data-id="0">
  <ol class="dd-list">
    <li class="dd-item" data-id="1">
      <div class="dd-handle">Sub-indicator 1</div>
      <ol class="dd-list">
        <li class="dd-item" data-id="2">
          <div class="dd-handle">Sub-indicator 2</div>
          <ol class="dd-list">
            <li class="dd-item" data-id="3">

              <div class="dd-handle">Sub-indicator 3</div>
              <ol class="dd-list">
                <li class="dd-item" data-id="4">

                  <div class="dd-handle">Sub-indicator 4</div>
                </li>
              </ol>
            </li>
          </ol>
        </li>
        <li class="dd-item" data-id="3">

          <div class="dd-handle">Sub-indicator 3</div>
          <ol class="dd-list">
            <li class="dd-item" data-id="4">

              <div class="dd-handle">Sub-indicator 4</div>
            </li>
          </ol>
        </li>
      </ol>
    </li>
  </ol>
</div>

票数 2
EN

Stack Overflow用户

发布于 2016-11-15 07:30:05

尝试一个简单的循环:

代码语言:javascript
复制
var data = [];//create the array
$('.dd-item').each(function() {//loop each item
  var parent = $(this).parent().closest('.dd-item');//get the parent
  var parent_id = 0;//set 0 if it has no parent
  if (parent.length) {
    parent_id = parent.attr('data-id');//set parent id if it has
  }
  data.push({
    parent_id: parent_id ,sub_indic_id: $(this).attr('data-id')
  });//append to the array
});
console.log(data);

演示:https://jsfiddle.net/uwqqmz86/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40604012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档