跳至內容
Astera Technology

JSON 物件可換鍵次序,陣列不可擅自換序

已解析物件可換鍵次序,陣列次序、類型及多鍵仍須相同。

下載完整個案資料及參考答案 ↓

訂明本例驗收任務

假設評分器比對有限的已解析 JSON 值。物件鍵次序不計,但陣列次序、鍵是否存在、值類型及 null 都計。不把數字字串轉整數,也不刪多出的鍵;逐層比結構,不比原字串。

  1. 先解析候選再比結構
  2. 只忽略物件鍵呈現次序
  3. 保留陣列、類型及鍵存在差別

未解析、循環或非 JSON 值須另設解析及規則。

使用已填個案

原創假設輸入及確切答案鍵
個案已提供輸入預期結構化結果判斷及原因
物件鍵換次序{"expected":{"a":1,"b":["X","Y"]},"answer":{"b":["X","Y"],"a":1}}{"equal":true}只改了物件呈現的鍵次序。
陣列倒轉{"expected":{"a":1,"b":["X","Y"]},"answer":{"a":1,"b":["Y","X"]}}{"equal":false}本例陣列次序有意義,不能排序後消去差異。
兩個比較值都欠{}{"error":"comparison-operands"}兩個欠缺欄不是兩個相等的有限 JSON 值。
多出 null 值鍵{"expected":{"a":1},"answer":{"a":1,"b":null}}{"equal":false}即使值為 null,多了鍵仍是結構差異。
下載可編輯 CSV ↓

逐步處理 extra-null-key 個案,須得到甚麼結果?原因是甚麼?

查看參考答案

{"equal":false}。即使值為 null,多了鍵仍是結構差異。

執行完整本機驗算

另存為 .mjs,以 Node.js 執行;只驗提供的個案
import assert from 'node:assert/strict';

function equal(a,b){
 if(a===b)return true;if(a===null||b===null||typeof a!=='object'||typeof b!=='object')return false;
 if(Array.isArray(a)||Array.isArray(b))return Array.isArray(a)&&Array.isArray(b)&&a.length===b.length&&a.every((v,i)=>equal(v,b[i]));
 const ak=Object.keys(a).sort(),bk=Object.keys(b).sort();return equal(ak,bk)&&ak.every(k=>equal(a[k],b[k]));
}
function evaluate(x){if(!Object.hasOwn(x,'expected')||!Object.hasOwn(x,'answer')||x.expected===undefined||x.answer===undefined)return {error:'comparison-operands'};return {equal:equal(x.expected,x.answer)};}

const cases = [
  {
    "id": "keys-reordered",
    "input": {
      "expected": {
        "a": 1,
        "b": [
          "X",
          "Y"
        ]
      },
      "answer": {
        "b": [
          "X",
          "Y"
        ],
        "a": 1
      }
    },
    "expected": {
      "equal": true
    }
  },
  {
    "id": "array-reversed",
    "input": {
      "expected": {
        "a": 1,
        "b": [
          "X",
          "Y"
        ]
      },
      "answer": {
        "a": 1,
        "b": [
          "Y",
          "X"
        ]
      }
    },
    "expected": {
      "equal": false
    }
  },
  {
    "id": "both-operands-absent",
    "input": {},
    "expected": {
      "error": "comparison-operands"
    }
  },
  {
    "id": "extra-null-key",
    "input": {
      "expected": {
        "a": 1
      },
      "answer": {
        "a": 1,
        "b": null
      }
    },
    "expected": {
      "equal": false
    }
  }
];
for (const c of cases) assert.deepEqual(evaluate(c.input), c.expected, c.id);
console.log(JSON.stringify({checked:cases.length,caseIds:cases.map(c=>c.id)}));
下載可執行例子 ↓

字元格式有效與此相等準則分開。兩結構相等,也可能相對來源都是錯值。

相關資源