【前端笔试】实现两个json对象的比较

便利蜂前端笔试题~
让实现一个function,比较两个json格式的数据是否一致,
我是用for of 去遍历,回来试了才知道for of 是不能遍历的对象的,应该用for in 的,反正官方是这么说的:

The for...of statement creates a loop iterating over iterable objects (including Array, Map, Set, String, TypedArray, arguments object and so on), invoking a custom iteration hook with statements to be executed for the value of each distinct property.

目前为止,你可以这样理解:JS已经有了几个不同的集合类,而且更多的集合类正在被添加进来。for-of循环语句的设计初衷就是适用于所有这些集合类。

for-of并不能用于普通的旧对象。如果你想要遍历对象的所有属性,可以使用for-in,也可以通过Object.keys(object)将对象的所有属性以数组形式返回后再使用for-of。

for (var key of Object.keys(someObject)) {   
console.log(key + ": " + someObject[key]);   
}  

说一下这个题吧。主要逻辑如下:

1. 二者长度是否一致,不一致返回false

自以为是的我直接json.length,其实是错误的。
有两种方法解决,一种是常规遍历:

var  count = 0;
for(let key in data.phones) {
  if(data.phones.hasOwnProperty(key)) {
    count++;
  }
}

另一种是转成数组:

if(Object.keys(obj1).length != Object.keys(obj2).length){
    return false;
}

2.比较key 和 value

  • 循环遍历json1,for in 获得key
  • hasOwnProperty判断json2中是否有该key属性。
  • 比较json1[key] === json2[key]

注意:
1.获取value 使用 json1[s]而不是json1.s;
2.在比较value之前,需要先判断json2中是否有key属性,一开始我认为如果没有hasOwnProperty方法判断,json2[key]会报错。然而实际不是这样的,对于json[x],即使x不是json里面的属性,也不会报错,只会返回undifined。但是hasOwnProperty仍然有存在的原因,比如json1里某属性值为undifined:

var json1 = {
    "a": 1,
    "b": 2,
    "c":undefined,
}
var json2 = {
    "a": 1,
    "b": 2,
    "d": 3,
}
json1["c"] ===json2["c"]  //ture

3.注意比较value要用===,同时比较类型和值;
否则如下obj比较就返回true了

var json1 = {
"a": true,
    "b": 2,
    "c": false,
}
var json2 = {
    "a": 1,
    "b": 2,
    "c": 0,
}

完整代码如下:

let fun = (obj1,obj2) =>{
    if(Object.keys(obj1).length != Object.keys(obj2).length){
        return false;
    }else{
        for (let x in obj1) {
            if(obj2.hasOwnProperty(x)){
                if(obj1[x] != obj2[x]){
                    return false;
                }
            }else{
                return false;
            }
        }
    }
    return true;

}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值