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