簡體   English   中英

如何將2個點符號字符串合並到GraphQL查詢字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM