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

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



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

对象修改结构

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

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))
相关文章
|
5月前
|
JavaScript 数据处理
|
5月前
|
JSON JavaScript 前端开发
js树形菜单 如何用递归制作一个简单的树形菜单
js树形菜单 如何用递归制作一个简单的树形菜单
84 0
|
5月前
|
存储 JavaScript 前端开发
JavaScript中的递归函数
JavaScript中的递归函数
45 0
|
5月前
|
JSON JavaScript 数据格式
js递归树形菜单
js递归树形菜单
|
17天前
|
JSON JavaScript 前端开发
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
JavaScript第五天(函数,this,严格模式,高阶函数,闭包,递归,正则,ES6)高级
|
2月前
|
缓存 JavaScript 前端开发
|
2月前
|
数据采集 资源调度 JavaScript
Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
【8月更文挑战第4天】Node.js 适合做高并发、I/O密集型项目、轻量级实时应用、前端构建工具、命令行工具以及网络爬虫和数据处理等项目
38 5
|
3月前
|
数据采集 缓存 JavaScript
JavaScript递归函数的设计与优化
JavaScript递归函数的设计与优化
|
4月前
|
JavaScript 前端开发 测试技术
了解JS递归
了解JS递归
27 1
|
4月前
|
JavaScript Serverless
JS实现递归功能
JS实现递归功能
下一篇
无影云桌面