【数据处理-番外篇】手写了几个数据处理,都是用的递归

news2024/11/25 6:34:13

在这里插入图片描述

博主:_LJaXi Or 東方幻想郷
专栏: JavaScript | 脚本语言
开发工具:Vs Code

数据处理

  • 对象修改结构
  • 判断两对象是否全等(只针对对象未做其他类型)
  • 复杂结构去重
    • 我写的破代码(没用,逻辑,结构都不对)

一些原理我也不讲了,我就是记录一下

对象修改结构

给出一个深层次嵌套对象, 要求编译成如下格式

let obj_one = {
    name: '张三',
    age: '18',
    address: '山东',
    info: {
      phone: '110',
      sex: '男'
    }
}

// 将此对象,改为 { value: { key: value } }, 结构不变
// let obj_one = {
//   '张三': { name: '张三' },
//   '18': { age: '18' }
//   '山东': { address: '山东' },
//   info: {
//     '110': { phone: '110' },
//     '男': { sex: '男' }
//   }
// }

解答

const changeObjDataFuc = obj => {
  // 定义存储对象
  let saveObj = {}
  // 判断对象内每一项是否为对象,若为对象,递归
  for (const key in obj) {
    if (Object.hasOwnProperty.call(obj, key)) {
      const item = obj[key]
      if (typeof item === 'object' && item !== null) {
        itemValue = changeObjDataFuc(item) // itemValue深层次对象
        saveObj[key] = itemValue;
      } else {
        saveObj = Object.assign(saveObj, reverseObject(key, item)); // 第一次: saveObj: { 张三: { name: "张三" }, ... }
      }
    }
  }
  return saveObj
}
const reverseObject = (key, value) => {
  return {
    [value]: { [key]: value } 
  }
}
console.log(changeObjDataFuc(obj_one))

判断两对象是否全等(只针对对象未做其他类型)

之前写过一次, 别跟我说用 JSON.stringify

let obj_one = {
  name: '张三',
  age: '18',
  address: '山东',
  info: {
    phone: '110',
    sex: '男'
  }
}

let obj_two = {
  name: '张三',
  age: '18',
  address: '山东',
  info: {
    phone: '110',
    sex: '男'
  }
}
// 判断两个对象键值是否全部相同,若是则返回true,否则返回false

解答

const objectFind = (obj_one, obj_two) => {
  if (Object.keys(obj_one).length !== Object.keys(obj_two).length) {
    // 判断键长度
    return false
  }
  for (const key in obj_one) {
    if (Object.hasOwnProperty.call(obj_one, key)) {
      const element = obj_one[key]
      if (typeof obj_one[key] === 'object' && typeof obj_two[key] === 'object') {
        // 判断每一项与obj_two对应的每一项
        // 递归判断若不等于
        if (!objectFind(obj_one[key], obj_two[key])) return false
      } else if (obj_one[key] !== obj_two[key]) {
        // 判断属性值
        return false
      }
    }
  }
  // 都相等返回true
  return true
}
const findData = objectFind(obj_one, obj_two);
console.log(findData);

复杂结构去重

给出一个复杂结构,要求去重,并且返回数据之后格式不变

let data = [
  {
    name: '小芳',
    age: 1,
    info: [
      {
        address: '北京',
        class: '三年级二班'
      },
      {
        address: '北京',
        class: '三年级二班'
      }
    ],
    obj: {
      objInfo1: [
        {
          objinfo1: 1
        },
        {
          objinfo1: 1
        }
      ],
      objInfo2: 2
    }
  },
  {
    name: '小明',
    age: 1,
    info: [
      {
        address: '北京',
        class: '三年级二班'
      }
    ]
  },
  {
    name: '小方',
    age: 1,
    obj: {
      arr: [
        {
          name: '123',
          age: 1
        },
        {
          name: '123',
          age: 1
        }
      ]
    }
  },
  {
    name: '小芳',
    age: 1,
    info: [
      {
        address: '北京',
        class: '三年级二班'
      }
    ]
  },
  {
    name: '小芳',
    age: 1
  },
  {
    name: '小芳',
    age: 1
  }
]
// 要求data数组去重,并且为深层次递归判断,不能更改数据结构,返回一个没有重复数据的新对象
// 较难

我写的破代码(没用,逻辑,结构都不对)

这是我写的, 逻辑有问题, 结构还不对, 如果有大佬会这个题, 希望可以贴在评论区, 嘤嘤嘤

let keys_data = {} // 定义数据第一次出现列表
// --------------------------------------------------------------------------------------
// 判断对象下data中是否有重复的元素, 此方法为递归
const getData = arr => {
  let newArr = []; // 新建一个数组
  for (let i = 0; i < arr.length; i++) {
    let newObj = getRepeatData(arr[i]);
    // 将处理后的对象添加到新数组
    newArr.push(newObj);
    // 循环里面的子项
    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 newArr
}

// 对象重复判断方法
// 思路: 每一项先存储,然后用存储的判断为存储的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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/865565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL不走索引的情况分析

未建立索引 当数据表没有设计相关索引时&#xff0c;查询会扫描全表。 create table test_temp (test_id int auto_incrementprimary key,field_1 varchar(20) null,field_2 varchar(20) null,field_3 bigint null,create_date date null );expl…

【C++】虚继承(virtual base classes)

【C】虚继承&#xff08;virtual base classes) 文章目录 【C】虚继承&#xff08;virtual base classes)1. 使用原因2. 解决方法3. 例题练习 1. 使用原因 在多重继承(Multiple Inheritance) 的情况下&#xff0c;尤其是菱形继承时&#xff0c;容易出现问题&#xff0c;关于菱…

STM32F429IGT6使用CubeMX配置GPIO点亮LED灯

1、硬件电路 2、设置RCC&#xff0c;选择高速外部时钟HSE,时钟设置为180MHz 3、配置GPIO引脚 4、生成工程配置 5、部分代码 6、实验现象

CentOS7有线未托管,网络连接图标消失

问题描述 网络图标消失&#xff0c;显示“有线 未托管”&#xff0c;且无法连接网络 解决方案 ①编辑文件&#xff1a;vim /etc/sysconfig/network-scripts/ifcfg-ens33 ②删除NM_CONTROLLEDno ③重启网络&#xff1a;service network restart 立马就可以自动连接上网络&…

SqlServer基础之(触发器)

概念&#xff1a; 触发器&#xff08;trigger&#xff09;是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法&#xff0c;它是与表事件相关的特殊的存储过程&#xff0c;它的执行不是由程序调用&#xff0c;也不是手工启动&#xff0c;而是由事件来触发&#x…

面试热题(两数之和)

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答…

并发——JDK 提供的并发容器总结

文章目录 一 JDK 提供的并发容器总结二 ConcurrentHashMap三 CopyOnWriteArrayList3.1 CopyOnWriteArrayList 简介3.2 CopyOnWriteArrayList 是如何做到的&#xff1f;3.3 CopyOnWriteArrayList 读取和写入源码简单分析3.3.1 CopyOnWriteArrayList 读取操作的实现3.3.2 CopyOnW…

K8S MetalLB LoadBalancer

1. 简介 kubernetes集群没有L4负载均衡&#xff0c;对外暴漏服务时&#xff0c;只能使用nodePort的方式&#xff0c;比较麻烦&#xff0c;必须要记住不同的端口号。 LoadBalancer&#xff1a;使用云提供商的负载均衡器向外部暴露服务&#xff0c;外部负载均衡器可以将流量路由…

【数学】CF1514 C

Problem - 1514C - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int M 2e5 10; constexpr int mod 998244353;void solve() {int n;std::cin >> n;std:…

图像处理技巧形态学滤波之腐蚀操作

1. 引言 欢迎回来&#xff0c;我的图像处理爱好者们&#xff01;今天&#xff0c;让我们深入研究图像处理领域中的形态学计算。这些非线性的图像处理技术允许我们操纵图像中对象的形状和结构。在本系列中&#xff0c;我们将依次介绍四种基本的形态学操作&#xff1a;腐蚀、膨胀…

走出象牙塔:李郓梁的区块链实践之路丨对话MVP

如何从科研走向实践&#xff1f;李郓梁在社区找到了答案。 作为西安工业大学的硕士研究生&#xff0c;李郓梁从学校的实验室接触区块链技术。通过研读大量论文&#xff0c;李郓梁为区块链多中心化、不可篡改等前沿理论深深着迷&#xff0c;并选择将区块链作为主要研究方向&…

网络原理(JavaEE初阶系列11)

目录 前言&#xff1a; 1.网络原理的理解 2.应用层 2.1自定义协议的约定 2.1.1确定要传输的信息 2.1.2确定数据的格式 3.传输层 3.1UDP 3.1.1UDP报文格式 3.2TCP 3.2.1确认应答 3.2.2超时重传 3.2.3连接管理 3.2.3.1三次握手 3.2.3.2四次挥手 3.2.4滑动窗口 3.…

Invalid bound statement (not found)

在使用Mybatisplus时报错Invalid bound statement (not found)&#xff0c;在此记录一下 先附上解决办法 step 1、启动类加上MapperScan注解 package com.study.test;import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; …

基于QT ,halcon实现可视化程序编程框架

基于qt ,halcon 实现可视化程序编程框架 完整源码 :订阅后 请加微信 SimpleAuto6,将在第一时间发送,未订阅,时间宝贵,勿扰 部分源码: #include "LogInDialog.h"LogInDialog::LogInDialog(int w, int h,QWidget *parent): QDialog(parent),m_Password(…

SpringBoot复习:(31)Controller中返回的对象是如何转换成json字符串给调用者的?

首先&#xff0c;SpringBoot自动装配了HttpMessageConvertersAutoConfiguration这个自动配置类 而这个自动配置类又通过Import注解导入了JacksonHttpMessageConvertersConfiguration类&#xff0c; 在这个类中配置了一个类型为MappingJackson2HttpMessageConverter类型的bean…

教你一招:非计算机科班如何丝滑转码?

近年来&#xff0c;很多人想要从其他行业跳槽转入计算机领域。非计算机科班如何丝滑转码&#xff1f; 目录 一、确定方向 二、确定学习计划&#xff08;自学&#xff09; 三、学习 看到组里好多非科班姐妹决定转码之后&#xff0c;因为相关背景知识不足难以确定学习计划&am…

田间农业数字管理系统-高标准农田建设

政策背景 2019年11月&#xff0c;国务院办公厅印发的《国务院办公厅关于切实加强高标准农田建设提升粮食安全保障能力的意见》明确提出&#xff0c;到2022年&#xff0c;全国要建成10亿亩高标准农田。 2021年9月16日&#xff0c;由农业农村部印发的《全国高标准农田建设规划&a…

python时间戳转换字符串时间

Python时间戳和日期格式之间的相互转化 将10位或13位时间戳转为日期格式&#xff08;年-月-日 时-分-秒&#xff09; python毫秒时间戳转为字符串时间 java默认精度是毫秒级别的&#xff0c;生成的时间戳是13位&#xff0c; 而python默认是10位的&#xff0c;精度是秒。如p…

2023牛客暑期多校训练营8-I Make It Square

2023牛客暑期多校训练营8-I Make It Square https://ac.nowcoder.com/acm/contest/57362/I 文章目录 2023牛客暑期多校训练营8-I Make It Square题意解题思路代码实现 题意 解题思路 这里有两种情况&#xff0c;即 ∣ s ∣ > ∣ t ∣ |s|>|t| ∣s∣>∣t∣和 ∣ s ∣…

如何让你的视频在 TikTok上变得火爆?

TikTok凭借巨大的用户量和商业价值&#xff0c;它从来不缺优质内容。如何在众多内容中脱颖而出获得关注&#xff0c;这并不简单。和泛流量账号不同&#xff0c;商业账号的目的更加明确&#xff0c;也就是说&#xff0c;商业账号并不一定要以高流量最为唯一的追求目标&#xff0…