0
votes

Aplatir un objet en utilisant Lodash

J'ai ci-dessous Cet objet imbriqué fort>

Je dois créer un tableau à l'aide de cet objet contenant les touches code>. Et si clés code> est un objet, il doit utiliser .Dot code> syntaxe. Et s'il s'agit d'une matrice, cela devrait me donner key.0.keName code>. Est-il possible de le faire? P>

sortie p> xxx pré>

Ce que j'ai essayé est juste laid et me donne le résultat attendu. Si c'est possible avec une manière plus concise. P>

p>

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 }

let object = {}
for (let k in invoiceObject) {
  if (typeof invoiceObject[k] === "object") {
    object[k] = {};
    for (let l in invoiceObject[k]) {
      object[k][l] = "";
    }
  } else if (typeof invoiceObject[k] === "array") {
    object[k] = [];
    for (let l in invoiceObject[k][0]) {
      object[k][l] = "";
    }
  } else {
    object[k] = "";
  }
}
console.log(object)


5 commentaires

Oui c'est possible. Qu'avez-vous essayé jusqu'à présent et quelles étaient les problèmes avec ce code que vous avez essayé?


Mis à jour @mplungjan. Vérifiez SVP


S'il vous plaît ne réinventez pas cela à moins que vous ne le faites pour un objectif académique: NPMJS.com/package/flat < / a>


Est-ce que cela répond à votre question? meilleur moyen d'aplatir Objet JS (clés et valeurs) à un seul tableau de profondeur


Je pourrais avoir une meilleure réponse ici. Et la plupart de la réponse de la duplicated une n'est pas ce que j'attendais. Aussi, j'ai utilisé la balise lodash ici. @Neige


3 Réponses :


1
votes

inspiré de la réponse donnée Dans ce message et compréhension, vous voulez simplement obtenir les noms de propriété, pas les valeurs, vous pouvez le faire comme ça. Désolé, cela utilise un javascript ordinaire.

function flattenObjectToKeyArray(ob) {
  var toReturn = [];
  for (var prop in ob) {
    if (!ob.hasOwnProperty(prop)) continue;

    if ((typeof ob[prop]) == 'object' && ob[prop] !== null) {
      var flatObject = flattenObjectToKeyArray(ob[prop]);
      for (var idx = 0; idx < flatObject.length; idx++) {
        toReturn.push(prop + '.' + flatObject[idx]);
      }
    } else {
      toReturn.push(prop);
    }
  }
  return toReturn;
}


1 commentaires

Merci beaucoup



1
votes

Vous pouvez résoudre ceci avec une fonction récursive. La fonction ci-dessous conserve la trace des touches actuelles et les rejoint dès qu'un point d'extrémité est atteint (un objet non-objet ou un objet / matrice vide).

p>

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));


1 commentaires

Merci beaucoup



1
votes

Vous pouvez créer une fonction récursive ( getschema code>) qui vérifie si une valeur ( val code>) est un objet (tableaux inclus), itérez-le avec _. Flatmap () code> et collecte les touches jusqu'à ce qu'il frappe une valeur qui n'est pas un objet. Il rejoint ensuite les clés collectées et renvoie la chaîne.

p>

const getSchema = (val, keys = []) =>
  typeof val === 'object' && val !== null ? // if it's an object or array
    Object.entries(val) // get [key, value] pairs of object/array
      .flatMap(([k, v]) => getSchema(v, [...keys, k])) // iterate it and call fn with the value and the collected keys 
    :
    keys.join('.') // return the joined keys

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 }

const result = getSchema(invoiceObject)

console.log(result)


1 commentaires

Merci beaucoup