來源格式與預期記錄
這是原創假設轉換例子。輸入限下列欄位的普通、無循環 JSON 形記錄,統一記錄格式及拒絕代碼由本例訂明。若換來源,先修改格式約定。
來源須明列 person 或 company。人士 given、family 不可全空,honorific 可不填。顯示名稱按本例「稱謂、名、姓」次序組合,只修剪顯示用文字;公司用 organisation。原欄位連空格照存,其他種類拒絕。
| 個案 | 輸入記錄(JSON) | 預期輸出(JSON) |
|---|---|---|
| 組合已提供姓名部分 | {"kind":"person","given":"Ada","family":"Chan","honorific":"Ms"} | {"ok":true,"value":{"kind":"person","display":"Ms Ada Chan","parts":{"honorific":"Ms","given":"Ada","family":"Chan"}}} |
| 拒絕未定姓名類型 | {"kind":"nickname","given":"Ada"} | {"ok":false,"error":"NAME_KIND"} |
| 保留公司類型 | {"kind":"company","organisation":"Demo Co"} | {"ok":true,"value":{"kind":"company","display":"Demo Co","parts":{"organisation":"Demo Co"}}} |
在本機執行轉換
把完整例子以 JavaScript 模組在 Node.js 執行,內含純轉換函數、三個輸入及寫明的預期輸出,對不上便由斷言停止。拒絕個案回傳 ok=false 及代碼,不回傳半份統一記錄。
import assert from 'node:assert/strict';
function nameParts(i){
const fail=error=>({ok:false,error});if(!i)return fail('NAME_KIND');
if(i.kind==='company'){
if(typeof i.organisation!=='string'||!i.organisation.trim())return fail('NAME_PART');
return {ok:true,value:{kind:'company',display:i.organisation.trim(),parts:{organisation:i.organisation}}};
}
if(i.kind!=='person')return fail('NAME_KIND');
if(typeof i.given!=='string'||!i.given.trim()||typeof i.family!=='string'||!i.family.trim()||(i.honorific!==undefined&&typeof i.honorific!=='string'))return fail('NAME_PART');
const honorific=i.honorific??'';
return {ok:true,value:{kind:'person',display:[honorific.trim(),i.given.trim(),i.family.trim()].filter(Boolean).join(' '),parts:{honorific,given:i.given,family:i.family}}};
}
// Original synthetic cases; expected outputs are literal records.
const cases = [
{
"label": "Compose supplied person parts",
"input": {
"kind": "person",
"given": "Ada",
"family": "Chan",
"honorific": "Ms"
},
"expected": {
"ok": true,
"value": {
"kind": "person",
"display": "Ms Ada Chan",
"parts": {
"honorific": "Ms",
"given": "Ada",
"family": "Chan"
}
}
}
},
{
"label": "Reject unknown name kind",
"input": {
"kind": "nickname",
"given": "Ada"
},
"expected": {
"ok": false,
"error": "NAME_KIND"
}
},
{
"label": "Preserve company kind",
"input": {
"kind": "company",
"organisation": "Demo Co"
},
"expected": {
"ok": true,
"value": {
"kind": "company",
"display": "Demo Co",
"parts": {
"organisation": "Demo Co"
}
}
}
}
];
for (const sample of cases) {
const actual = nameParts(sample.input);
assert.deepEqual(actual, sample.expected);
console.log(sample.label, JSON.stringify(actual));
}
判清邊界個案
Ms Ada Chan 為何仍保留三個名稱部分?
查看參考答案
顯示文字由 Ms、Ada、Chan 組合,三部分仍可分開取用。公司 Demo Co 保存 organisation,不會被猜成人士。