訂明本例驗收任務
假設評分器比對有限的已解析 JSON 值。物件鍵次序不計,但陣列次序、鍵是否存在、值類型及 null 都計。不把數字字串轉整數,也不刪多出的鍵;逐層比結構,不比原字串。
- 先解析候選再比結構
- 只忽略物件鍵呈現次序
- 保留陣列、類型及鍵存在差別
未解析、循環或非 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,多了鍵仍是結構差異。 |
逐步處理 extra-null-key 個案,須得到甚麼結果?原因是甚麼?
查看參考答案
{"equal":false}。即使值為 null,多了鍵仍是結構差異。
執行完整本機驗算
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)}));
字元格式有效與此相等準則分開。兩結構相等,也可能相對來源都是錯值。