这是我在vue2应用程序中的元素:

<div class="child-elements-container draggable-container">
    <div>
        <div entity-type="entitytype1" type="elementType" id="2" class="single-element"></div>
        <div class="child-elements-container draggable-container">
            <div>
                <div entity-type="entitytype2" type="elementType" id="59" class="single-element"></div>
            </div>
        </div>
    </div>
    <div>
        <div entity-type="measures" type="elementType" id="3" class="single-element"></div>
        <div class="child-elements-container draggable-container">
            <div>
                <div entity-type="entitytype3" type="elementType" id="13" class="single-element"></div>
                <div class="child-elements-container draggable-container"></div>
            </div>
            <div>
                <div entity-type="entitytype2" type="elementType" id="14" class="single-element"></div>
                <div class="child-elements-container draggable-container"></div>
            </div>
        </div>
    </div>
    <div>
        <div entity-type="entitytype3" type="elementType" id="11" class="single-element">
        </div>
        <div class="child-elements-container draggable-container">
            <div>
                <div entity-type="entitytype3" type="elementType" id="12" class="single-element">
                </div>
                <div class="child-elements-container draggable-container"></div>
            </div>
        </div>
    </div>
</div>

我试图得到一个具有单元素id的树 struct ,我使用这个函数来得到这个层次视图:

   buildDraggedHierarchy(el) {
            if (!el) {
                return [];
            }

            const children = [...el.querySelectorAll(":scope>div")];
            const output = children.map((child) => ({
                id: child.querySelector(".single-element") ? child.querySelector(".plan-element").id : null, 
                type: child.getAttribute("type"), 
                children: this.buildDraggedHierarchy(child.querySelector(".draggable-container")), 
            }));

            return output;
        },

但是输出是这样的:

[
    {
        "id": "2",
        "type": null,
        "children": [
            {
                "id": "59",
                "type": null,
                "children": []
            }
        ]
    },
    {
        "id": "3",
        "type": null,
        "children": [
            {
                "id": "13",
                "type": null,
                "children": []
            },
            {
                "id": "14",
                "type": null,
                "children": []
            }
        ]
    },
    {
        "id": "11",
        "type": null,
        "children": [
            {
                "type": null,
                "children": []
            }
        ]
    }
]

所以最后一个元素的子元素不正确.我希望子元素们会来,ID 12而不是ID根本没有显示.如何解决这个问题?

推荐答案

以下是几个问题:

  • 函数只在参数为false时执行return语句(基本情况),而在其他情况下则不执行.output的赋值不是很有用,因为这个变量在赋值后立即释放.return你给output分配的东西.
  • child元素不是具有idtype的元素.它位于更深一层,因此需要一个 Select 器.

解决办法如下:

const element = document.querySelector(".child-elements-container");
const elementHierarchy = this.buildDraggedHierarchy(element);
console.log(elementHierarchy);

function buildDraggedHierarchy(el) {
    if (!el) {
        return [];
    }
    let children = [...el.querySelectorAll(":scope>div")];
    return children.map((child) => {
        const elem = child.querySelector(".single-element");
        return {
            id: elem.id,
            type: elem.getAttribute("type"),
            children: this.buildDraggedHierarchy(child.querySelector(".draggable-container")),
        };
    });
}
<div class="child-elements-container draggable-container">
    <div>
        <div entity-type="entitytype1" type="elementType" id="2" class="single-element"></div>
        <div class="child-elements-container draggable-container">
            <div>
                <div entity-type="entitytype2" type="elementType" id="59" class="single-element"></div>
            </div>
        </div>
    </div>
    <div>
        <div entity-type="measures" type="elementType" id="3" class="single-element"></div>
        <div class="child-elements-container draggable-container">
            <div>
                <div entity-type="entitytype3" type="elementType" id="13" class="single-element"></div>
                <div class="child-elements-container draggable-container"></div>
            </div>
            <div>
                <div entity-type="entitytype2" type="elementType" id="14" class="single-element"></div>
                <div class="child-elements-container draggable-container"></div>
            </div>
        </div>
    </div>
    <div>
        <div entity-type="entitytype3" type="elementType" id="11" class="single-element">
        </div>
        <div class="child-elements-container draggable-container">
            <div>
                <div entity-type="entitytype3" type="elementType" id="12" class="single-element">
                </div>
                <div class="child-elements-container draggable-container"></div>
            </div>
        </div>
    </div>
</div>

Javascript相关问答推荐

如何通过onClick为一组按钮分配功能;

ReactJS中的material UI自动完成类别

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

使用复选框在d3.js多折线图中添加或删除线条

无法在nextjs应用程序中通过id从mongoDB删除'

Angular material 拖放堆叠的牌副,悬停时自动展开&

成功完成Reducers后不更新状态

在grafana情节,避免冲突的情节和传说

为什么!逗号和空格不会作为输出返回,如果它在参数上?

如何在Svelte中从一个codec函数中调用error()?

如何在我的Next.js项目中.blob()我的图像文件?

在VS代码上一次设置多个变量格式

自定义图表工具提示以仅显示Y值

在JS/TS中将复杂图形转换为数组或其他数据 struct

如何使用Reaction路由导航测试挂钩?

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

表单数据中未定义的数组键

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

在JS/TS中构造RSA公钥

在ReactJS上挂载组件时获得多个身份验证请求