JS(递归)对⽐两个对象的值是否相等,并且可以排除不想对⽐的键值对。JS对⽐两个对象的值是否相等,并且可以排除不想对⽐的键值对。
在项⽬中,我们需要判断⽤户是否对表单内的内容做过修改,假设有两种场景,⼀是⽤户新增的时候,⼆是⽤户修改的时候。
⽆论是⽤户修改还是新增,我们都可以拿到表单内的初始数据,使⽤vue项⽬来说,我们可以使⽤
this.$options.data().XXX//来拿到初始数据
this.XXX//拿到修改后的数据,这时候就需要对这两组数据进⾏对⽐
⼀、不排除⾥⾯的键,直接对⽐
JSON.stringify(XXX)==JSON.stringify(XXX)
// 转成字符串直接对⽐,但是有的浏览器可能⽀持的不是很好,⽐较推荐第⼆种⽅法
⼆、排除⼀些键,对⽐部分
//json 与 json2的option6数组的b值不相同 nest 与nest 2的最⾥层不相同 options 与options2的dra不相
同
let json ={
option:123,
option1:'123',
option2:{
option:12
},
option3:[
1,2,3
],
option4:{
a:{
a:1
},
b:{
a:1
}
},
option5:{
a:[1,2,3],
b:[1,2,3]
},
option6:[{
a:1,
b:2
},
{
a:1,
b:2
},
]
}
let json2 ={
option:123,
option1:'123',
option2:{
option:12
},
option3:[
1,2,3
],
option4:{
},
b:{
a:1
}
},
option5:{
a:[1,2,3],
b:[1,2,3]
},
option6:[{
a:1,
b:3
},
{
a:1,
b:2
},
]
}
let nest ={
a:{
a:[{
a:{
a:[{
a:[1]
}]
}
}]
}
}
let nest2 ={
a:{
a:[{
a:{
a:[{
a:[2]
}]
}
}]
}
}
let options ={
dra:false,
str:1,
num:2
}
let options2 ={
dra:true,
str:1,
num:2
}
//核⼼代码来了↓
function comparison(){
let bl =true
return function main(data1, data2, arr =[]){ if(!bl){
return bl
}
if(typeof data1 =='object'){
vuejson转对象if(Array.isArray(data1)){
for(let i =0; i < data1.length; i++){
main(data1[i], data2[i],arr)
for(let key in data1){
if(arr.indexOf(key)==-1){
main(data1[key], data2[key],arr)
}else{
continue
}
}
}
}else{
bl = data1 == data2
}
return bl
}
}
//核⼼代码来了↑
let fn =comparison()
//let jsonResult = fn(json, json2, ['option6']) //true
//let jsonResult2 = fn(json, json2) //false
/
/let nestResult = fn(nest, nest2) // false
//let nestResult2 = fn(nest, nest2, ["a"])//true
//let optionsResult = fn(options, options2) // false
//let optionsResult = fn(options, options2, ['dra']) // true
//这边是使⽤闭包定义了⼀个bl变量来记录是否改变,使⽤递归逐层对⽐,想尝试的⼩伙伴记得点个赞哦/* 第三个参数,数组⾥⾯喊着不想做对⽐的键,尝试的⼩伙伴需要⼀条⼀条去验证,因为闭包的原因,两条⼀起试的话如果上⼀条结果为假则会将bl置为假并且保留下来。所有尝试⼀条就注释⼀条哦。
记得双击,么么哒
*/
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论