需求描述

公司需要搭建一个paas平台兼容所有的硬件,硬件把自己采集到的数据发送到paas平台,paas平台把数据处理之发送到各个服务。很多时候硬件发送的数据量特别大,很多不是我们需要的,这个时候,我们把全部的数据进行转发的话,就会浪费大量的带宽,所以,我们需要选择需要的数据进行发送,数据过滤算法便是由此而来。

实现思路

技术: 原生js + elementplus的 Tree树形控件(主要用来显示)

  1. 按照一定的规则把硬件发送的对象拆分成一个一个的属性
  2. 对每一个属性进行标记【类型,父元素,所在的节点id等】
  3. 标记完成之后,把生成标记对象树传入tree树形控件以生成可视化页面
  4. 把标记树用json的形式存入数据库,或者redis缓存
  5. 把每个过滤规则和硬件绑定或者和硬件所在的组绑定
  6. 当硬件发送过数据来的时候,自动根据该硬件的过滤规则(即:标记树),把需要的数据组合成一个新的对象并发送给对应的服务。

标记树的结构,是根据elementPlus的tree组件要求而搭建的,根据tree的要求传入一个对象,便可以生成可视化的选择树,标记树的结构就是根据这个创建的,也可以用其他形式,不过思想都是一样的

实现代码

  • 把硬件数据拆分属性,并生成 标记树

/*** 数据过滤算法----合成属性 树(后期会根据属性树入库、生成对象)* @param {*} jsonData * @param {*} respTreeData * @param {*} level * @returns */
export const makePropertityTree = (jsonData, respTreeData, level) => {if (!respTreeData || !jsonData) {console.error("参数传递出现错误!!")return;}if (judgeType(jsonData) === "[object Object]") {// 对象类型Reflect.ownKeys(jsonData).forEach((val, idx, arr) => {let tmpId = (level ? level : "") + "" + idx + vallet tmpObj = {id: tmpId,label: val,type: judgeType(jsonData[val]),path: [],children: []}if (level) {tmpObj.path = [...respTreeData.path, tmpId]respTreeData.children.push(tmpObj)} else {tmpObj.path.push(tmpId)respTreeData.push(tmpObj)}if (judgeType(jsonData[val]) == "[object Object]") {makePropertityTree(jsonData[val], tmpObj, level ? level + 1 : 1)}})} else {// 如果参数类型不是 Object 直接原样传递,不做处理// 非对象类型let tmpObj = {id: "all",label: "all",type: judgeType(jsonData),path: [],children: []}respTreeData.push(tmpObj)}
}
  • 根据 标记树 过滤硬件的数据包,并生成需要的对象

/*** 根据属性树treeRef生成过滤对象* @param {*} treeRef  elemengplus 选择树 组件* @param {*} requestData  需要过滤的数据* * example: * * // 节点选择树 * const treeRef = ref(null);* const getCheckedNodes = () => {*  let filterData = filterPropertityObjByTreeRef(treeRef, testJson);*  console.log(filterData)* }*/
export const filterPropertityObjByTreeRef = (treeRef, requestData) => {let nodeList = treeRef.value.getCheckedNodes(false, false)let modelRuleObj = {};nodeList.forEach((val, idx) => {if(val.id == "all") {// 如果选择了全部属性,或者不过滤,直接返回对象所有属性。modelRuleObj = requestData;return;}let tmpPropertityObj = {};let tmpMiddleSaveObj = {};let targetPropertityObj = {};for (let i = 0; i < val.path.length; i++) {// 根据node key 循环 拿到 该属性的所有父节点let tmpNode = treeRef.value.getNode(val.path[i]).datalet pathLen = val.path.length;if (i == 0) {if (!tmpPropertityObj[tmpNode.label] && i != (pathLen - 1)) {if (tmpNode.type == "[object Object]") {tmpPropertityObj[tmpNode.label] = {};tmpMiddleSaveObj = tmpPropertityObj[tmpNode.label];}}} else {if (i != (pathLen - 1)) {if (!tmpMiddleSaveObj[tmpNode.label]) {tmpMiddleSaveObj[tmpNode.label] = {};}tmpMiddleSaveObj = tmpMiddleSaveObj[tmpNode.label];}}if (i == 0) {targetPropertityObj[tmpNode.label] = requestData[tmpNode.label]}targetPropertityObj = targetPropertityObj[tmpNode.label]if (i == (val.path.length - 1)) {if (val.path.length == 1) {tmpPropertityObj[val.label] = targetPropertityObj} else {if (judgeType(targetPropertityObj) != "[object Object]") {// 最后一个属性直接赋值tmpMiddleSaveObj[val.label] = targetPropertityObj}}}}modelRuleObj = mergeObjDeep(modelRuleObj, tmpPropertityObj)});// 过滤后的对象return modelRuleObj;
}
  • 类型判断函数 (用到的工具方法)
/*** [object String] 字符串* [object Number] 数字类型* [object Array] 数组* [object Date] 日期* [object Function] 函数* [object Object] 对象* @param {*} data * @returns */
export const judgeType = (data) => {return Object.prototype.toString.call(data);
}
  • 深度融合对象函数 (用到的工具方法)
/*** 深度融合两个对象* ... 合并对象只是简单地,浅层次的合并* @param {*} targetObj * @param {*} sourceObj * @returns */
export const mergeObjDeep = (targetObj, sourceObj) => {Reflect.ownKeys(sourceObj).forEach((val, idx, arr) => {if (targetObj[val]) {if (judgeType(sourceObj[val]) == "[object Object]") {mergeObjDeep(targetObj[val], sourceObj[val]);} else {targetObj[val] = sourceObj[val]}} else {targetObj[val] = sourceObj[val]}})return targetObj;
}

使用案例

  • 使用案例
import { makePropertityTree, filterPropertityObjByTreeRef } from "@/utils/propertityFilter.js"
let treeData = reactive([]);
// 生成标记树
makePropertityTree(testJson, treeData);
console.log("treeData", treeData);
console.log("testJson", testJson)// 节点选择树
const treeRef = ref(null);
const getCheckedNodes = () => {// 根据标记树 生成过滤后的对象let filterData = filterPropertityObjByTreeRef(treeRef, testJson);console.log(filterData)
}
  • 效果展示

  • 测试json数据
{"name": "张三","age": 18,"hobby": {"exercise": {"ball": ["basketball","pingpang"],"running": ["long-distance race","short"]},"reading": {"moyan": {"bookName": "平凡的世界","price": 200,"priz e": true,"bookDetail": {"totalNumber": "20万字","year": "2004年出版","author": "莫言"}}}},"family": ["father","mother","wife","son","me"],"school": {"bigSchool": "烟台大学","highSchool": "广饶一中","baseSchool": "李鹊镇初级中学","smallSchool": "东柳小学,艾家小学"}}

js数据过滤算法搭建相关推荐

  1. python协同过滤电影推荐_python实现基于用户的协同过滤算法(CF)——以电影评价数据(ml-100k)为例...

    程序简介 项目以ml-100k电影评分数据集为输入,实现了基于用户的协同过滤算法,最后预测的MAE为0.84,因为经过优化,10万条评分数据运行时间不超过2分钟 协同过滤算法(CF)基于对用户历史行为 ...

  2. JS判断数据类型以及数据过滤空值方法

    JS判断数据类型以及数据过滤空值方法 在我们的项目开发中,经常需要对一个传输中的数据进行滤空处理,过滤 null.undefined.''.[].{}等,还要对字符串进行去除两端的空格操作.为此,我写 ...

  3. 多种数据过滤与降维算法

    数据过滤 1. 缺失值比率 (Missing Values Ratio) 方法的是基于包含太多缺失值的数据列包含有用信息的可能性较少.因此,可以将数据列缺失值大于某个阈值的列去掉.阈值越高,降维方法更 ...

  4. 大数据Hadoop学习之————基于物品的协同过滤算法实现物品推荐

    一.基础概念 协同过滤算法一般分为两种实现: 基于用户的协同过滤算法(userCF):通过寻找相似兴趣的其他用户,为指定用户推荐物品.比如用户A喜欢商品A.B,用户B也喜欢商品A和B,则可以认为用户A ...

  5. 基于系统数据过滤权限设计之----lft, rgt的无限分类算法

    系统权限设计中的一般常见会有: 用户表 角色表 用户与角色关联表 资源表 角色与资源关联表. 当然这里介绍是笼统的,有些系统中会有用户组表或者角色组表,甚至为了把菜单资源和按钮资源分开,也创建单独的表 ...

  6. js实现数据分页算法

    数据分页算法 一.分页算法 二.百度分页算法 三.带数据的分页算法 一.分页算法 <script><!-- 分页的逻辑算法-->//当前页和总页码var nowPage=10; ...

  7. 点击模型:达观数据提升算法精度的利器

    在搜索.推荐.广告引擎中,系统会通过复杂算法生成一个最终的结果列表.用户在看到这个结果列表时,未必都会对排序满意,比如有时觉得排序的顺序有问题,或者发现一些不符合喜好的item.如果从算法层面来调优, ...

  8. win7下使用Taste实现协同过滤算法

    如果要实现Taste算法,必备的条件是: 1) JDK,使用1.6版本.需要说明一下,因为要基于Eclipse构建,所以在设置path的值之前要先定义JAVA_HOME变量. 2) Maven,使用2 ...

  9. Springboot+采用协同过滤算法的家政服务平台的设计与实现 毕业设计-附源码260839

    Springboot家政服务平台 摘  要 协同过滤算法是一种较为著名和常用的推荐算法,它基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐.基于协同过滤算法的家政服务平 ...

最新文章

  1. linux下IPTABLES配置详解
  2. java中引用一个文件数据_JAVA-基础-引用数据类型(类)
  3. Bagging(bootstrap aggregating)
  4. [转]分布式事务之TCC服务设计和实现注意事项
  5. idea中每次push/pull都需要输入账号密码
  6. 线性代数 —— 矩阵与矩阵运算
  7. 西工大18秋《C语言程序设计》平时作业,西工大18秋《C语言程序设计》平时作业(100分)...
  8. AE安装部署以及监测ArcEngine runtime 9.3是否安装
  9. A guide to convolution arithmetic for deep learning中译版
  10. 140:Bandwidth
  11. 解决Spring对静态变量无法注入问题(转)
  12. maya 处理 linux 鼠标变X
  13. Windows 10 下载官方正版ISO镜像文件
  14. pe服务器注册表,在PE里如何修改系统注册表?U盘PE下修改本机注册表方法
  15. pyecharts之参透神剧人物关系
  16. MySQL备份工具之xtrabackup
  17. 视频画中画制作,一键合并多个视频,简单又专业
  18. oracle 8i卸载,如何彻底卸载ORACLE8I?
  19. Task04: 文字图例尽眉目(12月datawhale组队)
  20. C++/学生信息管理系统

热门文章

  1. 川崎机器人f控制柜接线图_川崎机器人PROFINET总线通信图文教程
  2. Hadoop3.2.0 YARN资源配置
  3. 汇编jmp指令的一些用法(王爽)
  4. python课件百度文库_python教-教学课件.doc
  5. 亚马逊开店店铺选品技巧分析
  6. 【论文阅读】An LSTM-Based Deep Learning Approach for Classifying Malicious Traffic at the Packet Level
  7. hooks引用useRef,报错object is possibly undefined
  8. SkeyeVSS安防视频云解决方案助力解决幼儿园安全系统防护问题
  9. GifCam:有手就会的动图录制神器,GIF专用
  10. java管理和用户用一个入口登录_五、基于Struts的MVC案例:用户登录