Flatten an object using lodash

前端 未结 3 559
花落未央
花落未央 2021-01-26 04:48

I have below this nested object

I need to create an array using this object containing keys. And if keys are object then it should use .d

3条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-01-26 05:14

    You could solve this with a recursive function. The function below keeps track of the current keys, and joins them as soon as an end point is reached (a non-object or empty object/array).

    const invoiceObject = { "AllowIPNPayment": false, "AllowOnlinePayment": false, "AllowOnlineCreditCardPayment": false, "AllowOnlineACHPayment": false, "domain": "QBO", "sparse": false, "Id": "16", "SyncToken": "1", "MetaData": { "CreateTime": "2020-03-25T15:10:40-07:00", "LastUpdatedTime": "2020-03-26T11:06:49-07:00" }, "CustomField": [{ "DefinitionId": "1", "Name": "Crew #", "Type": "StringType" }], "DocNumber": "1007", "TxnDate": "2020-03-03", "CurrencyRef": { "value": "USD", "name": "United States Dollar" }, "LinkedTxn": [{ "TxnId": "32", "TxnType": "Payment" }], "Line": [{ "Id": "1", "LineNum": 1, "Description": "Custom Design", "Amount": 750, "DetailType": "SalesItemLineDetail", "SalesItemLineDetail": { "ItemRef": { "value": "4", "name": "Design" }, "UnitPrice": 75, "Qty": 10, "TaxCodeRef": { "value": "NON" } } }, { "Amount": 750, "DetailType": "SubTotalLineDetail", "SubTotalLineDetail": {} } ], "TxnTaxDetail": { "TotalTax": 0 }, "CustomerRef": { "value": "13", "name": "uiool" }, "CustomerMemo": { "value": "Thank you for your business and have a great day!" }, "SalesTermRef": { "value": "3" }, "DueDate": "2020-04-02", "TotalAmt": 750, "ApplyTaxAfterDiscount": false, "PrintStatus": "NeedToPrint", "EmailStatus": "NotSet", "BillEmail": { "Address": "uiikoool" }, "Balance": 450 };
    
    function getDotKeys(item, keys = []) {
      const isObject = item && typeof item == "object";
      if (!isObject) return Array.of(keys.join("."));
    
      const pairs = Array.isArray(item)
        ? item.map((value, index) => [index, value])
        : Object.entries(item);
    
      const isEmpty = !pairs.length;
      if (isEmpty) return Array.of(keys.join("."));
    
      const result = [];
      for (const [key, value] of pairs) {
        const dotKeys = getDotKeys(value, [...keys, key]);
        result.push(...dotKeys);
      }
      return result;
    }
    
    console.log(getDotKeys(invoiceObject));

    This does produce a different result than what you have in your question, since your solution stops at the second level for objects and third level for arrays. This solution also includes more then only index 0.

提交回复
热议问题