比較兩個Json對象是否相等

来源:http://www.cnblogs.com/simendancer/archive/2016/07/13/5666793.html
-Advertisement-
Play Games

一個前端同事遇到的面試題,抽空寫了寫,也算是個積累 1.先準備三個工具方法,用於判斷是否是對象類型,是否是數組,獲取對象長度 2.準備兩個相同或不同的Json對象 3.主要的代碼 4.調用方法 ...


一個前端同事遇到的面試題,抽空寫了寫,也算是個積累

 

1.先準備三個工具方法,用於判斷是否是對象類型,是否是數組,獲取對象長度

 1     function isObj(object) {
 2         return object && typeof (object) == 'object' && Object.prototype.toString.call(object).toLowerCase() == "[object object]";
 3     }
 4 
 5     function isArray(object) {
 6         return object && typeof (object) == 'object' && object.constructor == Array;
 7     }
 8 
 9     function getLength(object) {
10         var count = 0;
11         for (var i in object) count++;
12         return count;
13     }

2.準備兩個相同或不同的Json對象

 1    var jsonObjA = {
 2         "Name": "MyName",
 3         "Company": "MyCompany",
 4         "Infos": [
 5              { "Age": "100" },
 6              {
 7                  "Box": [
 8                     { "Height": "100" },
 9                     { "Weight": "200" }
10                  ]
11              }
12         ],
13         "Address": "馬欄山"
14     }
15     var jsonObjB = {
16         "Name": "MyName",
17         "Company": "MyCompany",
18         "Infos": [
19             { "Age": "100" },
20             {
21                 "Box": [
22                     { "Height": "100" },
23                     { "Weight": "200" }
24                 ]
25             }
26         ],
27         "Address": "馬欄山二號"
28     }

3.主要的代碼

 1     function Compare(objA, objB) {
 2         if (!isObj(objA) || !isObj(objB)) return false; //判斷類型是否正確
 3         if (getLength(objA) != getLength(objB)) return false; //判斷長度是否一致
 4         return CompareObj(objA, objB, true);//預設為true
 5     }
 6 
 7     function CompareObj(objA, objB, flag) {
 8         for (var key in objA) {
 9             if (!flag) //跳出整個迴圈
10                 break;
11             if (!objB.hasOwnProperty(key)) { flag = false; break; }
12             if (!isArray(objA[key])) { //子級不是數組時,比較屬性值
13                 if (objB[key] != objA[key]) { flag = false; break; }
14             } else {
15                 if (!isArray(objB[key])) { flag = false; break; }
16                 var oA = objA[key], oB = objB[key];
17                 if (oA.length != oB.length) { flag = false; break; }
18                 for (var k in oA) {
19                     if (!flag) //這裡跳出迴圈是為了不讓遞歸繼續
20                         break;
21                     flag = CompareObj(oA[k], oB[k], flag);
22                 }
23             }
24         }
25         return flag;
26     }

4.調用方法

1   var result = Compare(jsonObjA, jsonObjB);
2   console.log(result); // true or false

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 內聯元素,與別人公用一行,但是設置寬高無效。其特點: ①和其他元素都在一行上; ②高,行高及外邊距和內邊距不可改變; ③寬度就是它的文字或圖片的寬度,不可改變 ④內聯元素只能容納文本或者其他內聯元素 代碼如下: 1 <!doctype html> 2 <html lang="en"> 3 <head ...
  • 塊級元素,簡單來說,就是自己獨占一行的元素。其特點: ①總是在新行上開始; ②高度,行高以及外邊距和內邊距都可控制; ③寬度預設是它的容器的100%,除非設定一個寬度。 ④它可以容納內聯元素和其他塊元素 彙總代碼如下: 1 <!doctype html> 2 <html> 3 <head> 4 <m ...
  • 一、開端 真的是忙完這一陣子就可以忙下一陣子了啊。。。 最近在做一個angularJS+Ionic的移動端項目。。。記錄一些技巧,方便自己以後查閱,也方便需要的人可以看一看...^_^ 二、基礎原則瞭解 ①angular的一些入門瞭解 一、基礎知識 1.angular放棄了IE8 2.四大核心分別是 ...
  • javascript超過容器後顯示省略號效果 在實際的項目中,由於文字內容的長度不確定性和頁面佈局的固定性,難免會出現文字內容超過div(或其他標簽,下同)區域的情況,此時比較好的做法就是當文字超過限定的div寬度後自動以省略號(…)顯示,這樣,按照習慣,人們都會知道這兒有文字被省略了。css中有個... ...
  • 關於文件狀態 一般倉庫中的文件可能存在於這4種狀態: 1)Untracked files → 文件未被跟蹤(A) 2)Untracked but not Change → 已跟蹤,但是未修改(B) 3)Changes but not updated → 已跟蹤,文件被修改,但並沒有添加到暫存區(C) ...
  • 1.變數的命名 方法的命名(駝峰命名法) 全部小寫 : 單詞與單詞之間全部下劃線 (my_namespace) 大小寫混合 : 第一個單詞首字母小寫其他單詞首字母大寫。 規則 首字元 英文字母或下劃線 組成 英文字母 數字 下劃線 禁忌 JavaScript 關鍵字 保留字 2. 變數的聲明 顯示聲 ...
  • [1]個數 [2]優先順序 [3]結合性 [4]類型 [5]規則表 ...
  • 1. 這次藉助了表格組件, 參考資料地址: http://v3.bootcss.com/css/#tables 2. 使用了query 進行對滑鼠移入移出表格進行響應 參考資料地址: http://www.w3school.com.cn/jquery/ 3. 項目的github 地址:https:/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...