Symbol. Tao 2023-08-10 14:24 采纳率: 50%
浏览 3

一个数据深层次查重问题

有一个对象里面有个数组,然后数组中还有一个个对象,一个个对象内还有数组,对象内还有对象,可以算是一个比较复杂的结构
现在的问题是 当我打印 console.log(getData(obj.data)) 的时候, 它还是原来的数据,已经蒙了
而且 getRepeatData 方法深层次查询也不完善

chatgpt不会做这个,不要搜chatgpt了,找个diao大的帮忙解决下,感谢

    let keys_data = {} // 定义数据第一次出现列表
    // --------------------------------------------------------------------------------------
    // 判断对象下data中是否有重复的元素,此方法为递归
    const getData = arr => {
      for (let i = 0; i < arr.length; i++) {
        getRepeatData(arr[i])
        // 循环里面的子项
        for (const key in arr[i]) {
          if (Array.isArray(arr[i][key])) {
            getData(arr[i][key])
          } else if (typeof arr[i][key] === 'object') {
            getRepeatData(arr[i][key])
          }
        }
      }
      return arr
    }

    // 对象重复判断方法
    // 思路: 每一项先存储,然后用存储的判断为存储的item,key以及value是否全等,如果全等,那么就gg
    const getRepeatData = obj => {
      for (const key in obj) {
        if (Object.hasOwnProperty.call(obj, key)) {
          const item = obj[key]
          if (Array.isArray(item)) {
            getData(item)
          }
          if (keys_data[item] === undefined) {
            keys_data[key] = item
          }
        }
      }
      obj = keys_data
      newData = obj
      return obj
    }

    console.log(getData(obj.data))
    console.log(keys_data)
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-10 16:48
    关注

    【以下回答由 GPT 生成】

    思路: 1. 首先,我们看到代码中存在一个问题,就是在getRepeatData方法中,判断重复的时候,存储的应该是item而不是key,因为我们要判断的是值是否重复。 2. 其次,我们可以使用Set来进行查重操作,Set集合会自动去除重复的元素。 3. 在getData方法中,我们可以直接对数组进行去重操作,然后再对数组中的对象进行递归查重。 4. 最后,我们更新整理的代码如下:

    // 定义一个Set集合存储重复的元素
    let repeatSet = new Set();
    
    const getRepeatData = (obj) => {
      for (const key in obj) {
        if (Object.hasOwnProperty.call(obj, key)) {
          const item = obj[key]
          if (Array.isArray(item)) {
            getData(item)
          }
          // 使用Set集合判断元素是否重复
          if (repeatSet.has(item)) {
            console.log("重复元素:", item)
          } else {
            repeatSet.add(item);
          }
        }
      }
    }
    
    const getData = (arr) => {
      // 对数组进行去重操作
      arr = [...new Set(arr)];
      for (let i = 0; i < arr.length; i++) {
        getRepeatData(arr[i])
        // 循环里面的子项
        for (const key in arr[i]) {
          if (Array.isArray(arr[i][key])) {
            getData(arr[i][key])
          } else if (typeof arr[i][key] === 'object') {
            getRepeatData(arr[i][key])
          }
        }
      }
      return arr
    }
    
    console.log("结果:", getData(obj.data));
    

    这样就能够正确查重并打印结果了。

    注意:由于具体的数据结构和数据内容不清楚,以上代码是基于原有代码的改动,可能需要根据实际情况进行进一步调整。如果有具体的数据示例,可以提供给我,我可以更好地帮助你解决问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 8月10日

悬赏问题

  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入
  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
  • ¥15 Python报错怎么解决
  • ¥15 simulink如何调用DLL文件