天天看點

【前端筆試】實作兩個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 = ;
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": ,
    "b": ,
    "c":undefined,
}
var json2 = {
    "a": ,
    "b": ,
    "d": ,
}
json1["c"] ===json2["c"]  //ture
           

3.注意比較value要用===,同時比較類型和值;

否則如下obj比較就傳回true了

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

完整代碼如下:

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;

}
           

繼續閱讀