js两个数组合并,a属性相同往b属性push,a属性不用往这个数组添加


    <script>
      let arr = [{ a: "我是a1", b: [{ a: "二层c1", b: [{ id: 1 }] }] }]

      let obj = {}
      arr.forEach((v) => {
        obj[v.a] = v.b
      })
      Object.keys(obj).forEach((v) => {
        let newObj = {}
        obj[v].forEach((j) => {
          newObj[j.a] = j.b
          obj[v] = newObj
        })
      })

      //  console.log(obj) // {"我是a1":{"二层c1":"二层d1"},"我是a2":{"二层c2":"二层d2"}}

      let arr2 = [
        { a: "我是a1", b: [{ a: "二层c1", b: [{ id: 3 }] }] },
        { a: "我是a1", b: [{ a: "二层c2", b: [{ id: 6 }] }] },
        { a: "我是a2", b: [{ a: "二层c2", b: [{ id: 4 }] }] },
        { a: "我是a2", b: [{ a: "二层c3", b: [{ id: 2 }] }] },
        { a: "我是a3", b: [{ a: "二层c2", b: [{ id: 4 }] }] },
      ]
      //  把arr2转成obj2
      let obj2 = {}
      arr2.forEach((v) => {
        obj2[v.a] = v.b
      })
      Object.keys(obj2).forEach((v) => {
        let newObj = {}
        obj2[v].forEach((j) => {
          newObj[j.a] = j.b
          obj2[v] = newObj
        })
      })
      //   console.log(obj2)

      // 将obj2合并到obj
      //   1.判断:obj的key是否有obj2的key,没有添加,有继续判断
      arr2.forEach((v) => {
        if (v.a in obj) {
          // 记住这个方法,判断对象的key

          // -------- 这个最后看 start -----------
          // 2. 里面还有一层,继续判断
          v.b.forEach((j) => {
            if (j.a in obj[v.a]) {
              obj[v.a][j.a] = [...obj[v.a][j.a], ...j.b] // 第二次有这个key,则往这个的b数组里面push
            } else {
              obj[v.a][j.a] = j.b // 第二次的没有这个key则添加这个key
            }
          })
          // -------- 这个最后看 end -----------
          
        } else {
          obj[v.a] = v.b // obj中没有这个key,则添加这个kye
        }
      })

      console.log(obj)
      /*   最后的结果
            {
              我是a1: {
                二层c1: [{ id: 1 }, { id: 3 }],
                二层c2: [{ id: 6 }],
              },
              我是a2: [{ a: "二层c2", b: [{ id: 4 }] }],
              我是a3: [{ a: "二层c2", b: [{ id: 4 }] }],
            }
      */
    </script>
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值