js将对象的键和值分别归纳进对象,并将多层对象转化成数据的方法

前言:

后端传给我一个没有处理过的json串,但是我要传入el-tree做渲染,此篇来记录一下整个数据处理过程以及el-tree的使用

需求描述:

一、树结构可以展开可以收缩,默认全部展开

二、有一些关键词需要高亮展示红色

三、树结构左边加线条,使得树结构看起来更直观

(如下图)

后端传过来的参数:

"{\"frame\":{\"frame.interface_id\":\"0\",\"frame.interface_id_tree\":{\"frame.interface_name\":\"p11p1\"},\"frame.encap_type\":\"1\",\"frame.time\":\"Sep 30, 2024 08:47:16.070993552 UTC\",\"frame.offset_shift\":\"0.000000000\",\"frame.time_epoch\":\"1727686036.070993552\",\"frame.time_delta\":\"1.363581003\",\"frame.time_delta_displayed\":\"1.363581003\",\"frame.time_relative\":\"283.445248479\",\"frame.number\":\"222\",\"frame.len\":\"60\",\"frame.cap_len\":\"60\",\"frame.marked\":\"0\",\"frame.ignored\":\"0\",\"frame.protocols\":\"eth:ethertype:data\"},\"eth\":{\"eth.dst\":\"ff:ff:ff:ff:ff:ff\",\"eth.dst_tree\":{\"eth.dst_resolved\":\"Broadcast\",\"eth.dst.oui\":\"16777215\",\"eth.addr\":\"ff:ff:ff:ff:ff:ff\",\"eth.addr_resolved\":\"Broadcast\",\"eth.addr.oui\":\"16777215\",\"eth.dst.lg\":\"1\",\"eth.lg\":\"1\",\"eth.dst.ig\":\"1\",\"eth.ig\":\"1\"},\"eth.src\":\"7c:d9:a0:69:e9:9c\",\"eth.src_tree\":{\"eth.src_resolved\":\"HuaweiTe_69:e9:9c\",\"eth.src.oui\":\"8182176\",\"eth.src.oui_resolved\":\"Huawei Technologies Co.,Ltd\",\"eth.addr\":\"7c:d9:a0:69:e9:9c\",\"eth.addr_resolved\":\"HuaweiTe_69:e9:9c\",\"eth.addr.oui\":\"8182176\",\"eth.addr.oui_resolved\":\"Huawei Technologies Co.,Ltd\",\"eth.src.lg\":\"0\",\"eth.lg\":\"0\",\"eth.src.ig\":\"0\",\"eth.ig\":\"0\"},\"eth.type\":\"0x00009998\"},\"data\":{\"data.data\":\"00:01:00:00:00:0d:00:00:00:04:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00\",\"data.len\":\"46\"}}

el-tree要的参数:

一、使用el-tree组件

html 复制代码
      <div class="custom-tree-node-container">
        <el-tree
          style="max-width: 600px"
          :data="trafficDetail"
          node-key="id"
          default-expand-all
          :props="{ class: customNodeClass }"
        />
      </div>

具体参数element官网都有,可以自行去查看

二、处理数据

1、先将json格式转换成对象

javascript 复制代码
  console.log(JSON.parse(val), "json转化后的结果");

结果可以看到就是一个多层对象:

2、写递归函数来处理

javascript 复制代码
function transformObjectToArray(obj, idCounter = { currentId: 0 }) {
    const result = [];

    // 定义需要添加 isPenultimate 的标签
    const penultimateLabels = ["ip.version", "ah.", "vlan", "mac", "mpls."];

    for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
            const item = {
                id: idCounter.currentId++, // 生成唯一ID
                label: key,
                children: []
            };

            // 检查是否需要添加 isPenultimate 属性
            if (penultimateLabels.includes(key)) {
                item.isPenultimate = true;
            }

            // 检查是否存在子对象
            if (typeof obj[key] === 'object' && obj[key] !== null) {
                // 递归调用以处理子对象
                item.children = transformObjectToArray(obj[key], idCounter);
            } else {
                // 如果不是对象,则直接放入 children
                item.children.push({ id: idCounter.currentId++, label: obj[key] });
            }

            result.push(item);
        }
    }

    return result;
}

// 测试数据
  const input = {
    "eth.dst": "01:80:c2:00:00:00",
    "eth.dst_tree": {
      "eth.dst_resolved": "Spanning-tree-(for-bridges)_00",
      "eth.dst_tree": {
        "eth.dst_resolved": "Spanning-tree-(for-bridges)_00",
        "eth.dst.oui": "98498",
      },
    },
    "ip.version": "IPv4",
    "ah.": "AH Value",
    vlan: "VLAN 100",
    mac: "00:1A:2B:3C:4D:5E",
    "mpls.": "MPLS Value",
  };

  // 转换并输出结果
  const output = transformObjectToArray(input);
  console.log(JSON.stringify(output, null, 2));

输出结果:

注:

1、这里用了currentId给树结构加一个id来代表唯一值,因为el-tree默认展开的时候需要唯一值;(需求一)
2、penultimateLabels里面放的就是需要高亮展示的关键词,添加 isPenultimate 属性就是为了标记需要高亮的node,编写css来搭配使用:
css 复制代码
:deep .is-penultimate > .el-tree-node__content {
  color: red;
}

再加上一个类处理函数;(需求二)

javascript 复制代码
const customNodeClass = (data, node) => {
  if (data.isPenultimate) {
    return "is-penultimate";
  }
  return null;
};
3、给树结构加辅助线功能,简单来说就是给该给的盒子加上左边框:(需求三)
css 复制代码
:deep .el-tree > .el-tree-node > .el-tree-node__children > .el-tree-node {
    border-left: black 1px dashed;
    position: relative;
    left: 15px;
  }
  :deep
    .el-tree
    > .el-tree-node
    > .el-tree-node__children
    > .el-tree-node
    > .el-tree-node__children {
    border-left: black 1px dashed;
    position: relative;
    left: 25px;
  }
相关推荐
开开心心就好2 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
默_笙6 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan8 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
+VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
雪芽蓝域zzs9 小时前
第 7 章:双 Y 轴组合图(柱状 + 折线,看板高频场景)
vue.js·echars
一 乐9 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
天若有情67310 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具
vx-程序开发10 小时前
【计算机毕设】django校园跑腿服务系统83141
java·数据库·vue.js·spring boot·spring·elasticsearch·django
林语琛11 小时前
我写的 switch…break 被 Babel 偷偷吞了
前端·javascript·babel
liuchangng11 小时前
Jev 模型研究:从生成式大模型到决策式模型——System One、RLCD 校准与采用边界
java·javascript·人工智能·python·深度学习