结构整合算法

这篇博客涵盖了数据处理的多个方面,包括数组数据的扁平化转换为树形结构,实现递归处理,以及防抖和节流技术在事件监听中的应用。此外,还涉及冒泡排序算法、浅拷贝和深拷贝的区别,以及实现简单的拖拽效果。最后,讨论了数组查重的方法。这些内容对于理解和提升前端开发中的数据操作和性能优化至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组数据扁平转树形结构

 const data = [
        { id: "01", name: "张大大", pid: "", job: "项目经理" },
        { id: "02", name: "小亮", pid: "01", job: "产品leader" },
        { id: "03", name: "小美", pid: "01", job: "UIleader" },
        { id: "04", name: "老马", pid: "01", job: "技术leader" },
        { id: "05", name: "老王", pid: "01", job: "测试leader" },
        { id: "06", name: "老李", pid: "01", job: "运维leader" },
        { id: "07", name: "小丽", pid: "02", job: "产品经理" },
        { id: "08", name: "大光", pid: "02", job: "产品经理" },
        { id: "09", name: "小高", pid: "03", job: "UI设计师" },
        { id: "10", name: "小刘", pid: "04", job: "前端工程师" },
        { id: "11", name: "小华", pid: "04", job: "后端工程师" },
        { id: "12", name: "小李", pid: "04", job: "后端工程师" },
        { id: "13", name: "小赵", pid: "05", job: "测试工程师" },
        { id: "14", name: "小强", pid: "05", job: "测试工程师" },
        { id: "15", name: "小涛", pid: "06", job: "运维工程师" }
      ];

  let newArr = [];
      data.forEach(item => {
        if (item.pid === "") {
          newArr.push(item);
        }
        const child = data.filter(data => data.pid === item.id);
        if(child.length === 0) return
        item.child = child
      });
      console.log(newArr);

// 递归写法
   function terrData (list, rootValue) {
      const arr = []
      list.forEach(item => {
        if (item.pid === rootValue) {
          const child = this.terrData(list, item.id)
          console.log(child)
          if (child.length) {
            item.child = child
          }
          arr.push(item)
        }
      })
      return arr
    }

 防抖节流

    div.addEventListener('click', fn(()=>{
       console.log(123);
     }))
     function fn(fn1) {
       let tiem = null
       return function() {
         clearInterval(tiem)
         tiem = setTimeout(()=>{
           fn1()
         },1000)
       } 
     }
 div.addEventListener(
        "click",
        fn(() => {
          console.log(123);
        })
      );

      function fn(fn1) {
        let tiem = null;
        return function() {
          if (tiem) {
            return;
          }
          tiem = setTimeout(() => {
            fn1();
            tiem = null;
          }, 1000);
        };
      }

  冒泡排序

function bubbleSort(arr) {

    var len = arr.length;

    for (var i = 0; i < len - 1; i++) {

        for (var j = 0; j < len - 1 - i; j++) {

            if (arr[j] > arr[j+1]) {       // 相邻元素两两对比

                var temp = arr[j+1];       // 元素交换

                arr[j+1] = arr[j];

                arr[j] = temp;
            }
        }
    }
    return arr;
}

浅拷贝

        // 浅拷贝
        let obj = {
            uname: '张三丰',
            age: 22,
            sex: '男'
        }
        let newObj = {}
        for (let k in obj) {
            newObj[k] = obj[k]
        }
        obj.uname = '阿飞'
        console.log(newObj, obj);
        // 方法
        Object.assign(newObj, obj)

深拷贝

        let a = {
            uname: '张三丰',
            age: 22,
            sex: '男',
            color: ['red', ',asdasd'],
            message: {
                idnex: 1,
                score: 99
            }
        }
        let b = {}

        function kaobei(newObj, obj) {
            for (let k in obj) {
                if (obj[k] instanceof Array) {
                    newObj[k] = [] // 定义一个空数组
                    kaobei(newObj[k], obj[k]) // 递归  遇见数组 就递归  直到遇见简单类型赋值
                } else if (obj[k] instanceof Object) {
                    newObj[k] = {}
                    kaobei(newObj[k], obj[k]) // 递归
                } else {
                    newObj[k] = obj[k]
                }
            }
        }
        kaobei(b, a)
        console.log(a, b);

拖拽

 <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        div {
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
    <script>
        window.addEventListener("load", function() {
            let div = document.querySelector('div')

            function move(e) {
                let X = e.clientX - divX
                let Y = e.clientY - divY

                if (X < 30) {
                    X = 0;
                } else if (X > document.documentElement.clientWidth - div.offsetWidth) {
                    X = document.documentElement.clientWidth - div.offsetWidth;
                }


                if (Y < 0) {
                    Y = 0
                } else if (Y > document.documentElement.clientHeight - div.offsetHeight) {
                    Y = document.documentElement.clientHeight - div.offsetHeight
                }


                div.style.top = Y + 'px'
                div.style.left = X + 'px'

            }
            let divX
            let divY

            div.addEventListener("mousedown", function(e) {
                divX = e.offsetX
                divY = e.offsetY
                document.addEventListener('mousemove', move)

            })

            div.addEventListener('mouseup', function() {
                document.removeEventListener('mousemove', move)
            })


        })
    </script>
</head>

<body>
    <div>

    </div>
</body>

数组查重

methods1(arr) {
  return Array.from(new Set(arr))
},

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值