跳至內容
Astera Technology

按已列明的人士或公司欄位組合顯示名稱

保存分開的名稱資料,不從一段文字猜拆。

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

來源格式與預期記錄

這是原創假設轉換例子。輸入限下列欄位的普通、無循環 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"}}}
下載可編輯 CSV ↓

在本機執行轉換

把完整例子以 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,不會被猜成人士。

相關資源