[英]How can I merge 2 dot notation strings to a GraphQL query string
我正在嘗試將2個點符號字符串合並到僅使用javascript的GrahQL查詢中(可以是ES6 /打字稿)。
例如,假設我有一個字符串數組
[
'firstName',
'lastName',
'billing.address.street',
'billing.address.zip',
'shipping.address.street',
'shipping.address.zip'
]
預期的查詢字符串輸出為(空格不重要)
firstName, lastName, shipping{address{street, zip}}, billing{address{street, zip }}
我可以將點表示法乘以1轉換為查詢字符串,但是如何將所有這些合並在一起? 我有一個函數,它接受street.name
並輸出street { name }
。 所以這個功能可以做到
convertToString(inputString) {
let result = '';
if (inputString.indexOf('.') === -1) {
result = inputString;
} else {
const inputArray = inputString.split('.');
for (let i = inputArray.length - 1; i >= 0; i--) {
if (i === 0) {
result = inputArray[i] + result;
} else {
result = '{' + inputArray[i] + result + '}';
}
}
}
return result;
}
console.log(convertToString('address.street')); // address { street }
但是,然后我將如何遍歷所有字符串並僅獲得1個將相同屬性組合到一個組中的GraphQL查詢字符串。 主要問題是如何合並2個點表示法字符串而不丟失任何內容且沒有重復項(此時,我可以獲取此address { name } address { zip }
但是當它在GraphQL服務器上運行時,只有后者保留,因此結果中僅顯示zip
。
我嘗試創建表示該結構的臨時對象,但是效果並不理想。
修改后的答案
根據您修改后的問題和要求,這是修改后的答案。 這將從嵌套的點表示法遞歸地構建一個對象,然后利用JSON.stringify
來構建查詢字符串(通過一些字符串操作);
function buildQuery(...args) { const set = (o = {}, a) => { const k = a.shift(); o[k] = a.length ? set(o[k], a) : null; return o; } const o = args.reduce((o, a) => set(o, a.split('.')), {}); return JSON.stringify(o) .replace(/\\"|\\:|null/g, '') .replace(/^\\{/, '') .replace(/\\}$/, ''); } const query = buildQuery( 'firstName', 'lastName', 'billing.address.street', 'billing.address.zip', 'shipping.address.street', 'shipping.address.zip' ); console.log(query);
原始答案
我建議先將各個點符號字符串轉換為對象,然后再將該對象轉換為字符串。
function buildQuery(...args) {
let q = {};
args.forEach((arg) => {
const [ o, a ] = arg.split('.');
q[o] = q[o] || [];
if (a) q[o] = q[o].concat(a);
});
return Object.keys(q).map((k) => {
return q[k].length ? `${k} \{ ${q[k].join(', ')} \}` : k;
}).join(', ');
}
const query = buildQuery('person.name', 'person.email', 'street.name', 'street.zip');
console.log(query);
// "person { name, email }, street { name, zip }"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.