javascript - 将对象数组渲染为树

标签 javascript arrays reactjs tree

我有一个对象数组,其中每个元素都包含一个表示其在树结构中位置的字符串。基于该数据生成 TreeView (例如使用基本的 ul/li 标记)的简单方法是什么?

事先不知道树结构的深度,所以递归可能是解决方案?

我正在使用 React,但我想这个问题并不是真正特定于 React 的,因此通用 JS 甚至伪代码都会有很大帮助。

示例数据:

[
    {
        "name":  "banana",
        "path": "food.healthy.fruit",
        // ... may contain other parameters
    },
    {
        "name":  "apple",
        "path": "food.healthy.fruit"
    }
    {
        "name":  "carrot",
        "path": "food.healthy.vegetable"
    },
    {
        "name":  "bread",
        "path": "food"
    },
    {
        "name":  "burger"
        "path": "food.unhealthy"
    },
    {
        "name":  "hotdog"
        "path": "food.unhealthy"
    },
    {
        "name": "germany",
        "path": "country.europe"
    },
    {
        "name": "china",
        "path": "country.asia"
    }
]

期望的结果:

<ul>
    <li>
    food
    <ul>
        <li>bread</li>
        <li>healthy
        <ul>
            <li>
            fruit
            <ul>
                <li>apple</li>
                <li>banana</li>
            </ul>
            </li>
            <li>
            vegetable
            <ul>
                <li>carrot</li>
            </ul>
            </li>
        </ul>
        </li>
        <li>
        unhealthy
        <ul>
            <li>burger</li>
            <li>hotdog</li>
        </ul>
        </li>
    </ul>
    </li>
    <li>
    country
    <ul>
        <li>
        europe
        <ul>
            <li>germany</li>
        </ul>
        </li>
        <li>
        asia
        <ul>
            <li>china</li>
        </ul>
        </li>
    </ul>
    </li>
</ul>
  • > 食物
    • 面包
    • 健康
      • > 水果
        • 苹果
        • 香蕉
      • > 蔬菜
        • 胡萝卜
    • > 不良
      • 汉堡
      • 热狗
  • > 国家
    • > 欧洲
      • 德国
    • > 亚洲
      • 中国

最佳答案

首先按路径分组。

您可以通过遍历源数据并按点符号为每个项目拆分路径来执行此操作。然后像这样通过键将每个项目存储在一个对象中

store[country] = store[country] || {}
store[country][europe] = store[country][europe] || []
store[country][europe].push(germany)

然后在根级别获取对象的所有键并递归渲染所有项目。这是一些伪代码:

function render(store){

    let keys = Object.keys(store)

    let ul = document.createElement('ul')

    for (var i = 0; i < keys.length; i++){

      let key = keys[i]

      if (typeof store[key] === 'object') {

        let li = document.createElement('li')

        //create a branch, return it with our render function and append to current level
        li.appendChild(render(store[key]))

      } else {

         // create html presentation for all items under the current key

         let li = document.createElement('li')

      }

       ul.appendChild(li)

    } 

    return ul

}

关于javascript - 将对象数组渲染为树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41638873/

相关文章:

reactjs - react native 。无法从 map 函数内设置引用

javascript - div的拉伸(stretch)背景

javascript - 当发送带有文件和字段的 FormData 时,busboy 仅触发文件事件

javascript - 如何在出现错误时不停止地检查 cypress 中的所有链接

javascript - 在 Javascript 中使用鼠标拖动事件的图像旋转器

java - 如何用给定值填充数组

具有可变维度的 JavaScript 函数数组

javascript - 为javascript中的重复元素创建新数组

reactjs - useSelector 在初始页面加载时未接收状态,破坏了 Material ui 表

node.js - 对来自 JSON 正文的值使用 Sequelize 运算符