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

在这里插入图片描述

博主:_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))

你可能感兴趣的:(JavaScript,脚本语言,javascript,开发语言,ecmascript)