Search code examples
javascriptarraysloopsjavascript-objectspipedream

Pipedream - Getting values from nested Json (complex)


an overview of my issue

Am a novice in programming.

Have created a flow in Pipedream, where i converted an xml object to json.

Need to get all values 'name' with format 123456-123-1234 as from a certain level (see picture). The issue is that some levels contain the item straight away, some have multiple items, and therefore another nested array.

The full json array =

    [{"_attributes":{"category":"type","description":"Chassi","factoryDiscount":"none","instance":"0","isCostEdited":"false","isLeaf":"false","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"2.00","listPrice":"24736.00","name":"chassi","netPrice":"11625.92","qty":"1.00","salesPrice":"12615.36"},"items":{"item":{"_attributes":{"category":"type","category2":"type","description":"L06 AC : 0,6t","factoryDiscount":"chassi","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"3.00","listPrice":"24736.00","name":"117101-1100-005","netPrice":"11625.92","qty":"1.00","salesPrice":"12615.36"}}}},{"_attributes":{"category":"type","description":"Ancillaries","factoryDiscount":"none","instance":"0","isCostEdited":"false","isLeaf":"false","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"2.00","listPrice":"152.00","name":"ancilleries","netPrice":"71.44","qty":"1.00","salesPrice":"77.52"},"items":{"item":[{"_attributes":{"category":"wheels","category2":"wheels","description":"DW polyurethane with tread","factoryDiscount":"ancillary","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"3.00","listPrice":"152.00","name":"115202-1640-015","netPrice":"71.44","qty":"1.00","salesPrice":"77.52"}},{"_attributes":{"category":"wheels","category2":"wheels","description":"LW Single polyurethane","factoryDiscount":"ancillary","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"3.00","listPrice":"0.00","name":"115202-1650-005","netPrice":"0.00","qty":"1.00","salesPrice":"0.00"}},{"_attributes":{"category":"mast_options","category2":"mast_options","description":"Central lever LLC","factoryDiscount":"ancillary","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"3.00","listPrice":"0.00","name":"112000-5100-005","netPrice":"0.00","qty":"1.00","salesPrice":"0.00"}},{"_attributes":{"category":"safety","category2":"safety","description":"Technical Documentation NL","factoryDiscount":"ancillary","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"3.00","listPrice":"0.00","name":"117101-7850-040","netPrice":"0.00","qty":"1.00","salesPrice":"0.00"}},{"_attributes":{"category":"safety","category2":"safety","description":"RAL 2002 Vermillion","factoryDiscount":"ancillary","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"3.00","listPrice":"0.00","name":"117101-7900-005","netPrice":"0.00","qty":"1.00","salesPrice":"0.00"}}]}},{"_attributes":{"category":"type","category2":"type","description":"Battery & Charger","factoryDiscount":"none","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"2.00","listPrice":"0.00","name":"battery_charger","netPrice":"0.00","qty":"1.00","salesPrice":"0.00"}},{"_attributes":{"category":"taxes","description":"Taxes","factoryDiscount":"none","instance":"0","isCostEdited":"false","isLeaf":"false","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"2.00","listPrice":"0.00","name":"taxes","netPrice":"0.00","qty":"1.00","salesPrice":"0.00"},"items":{"item":[{"_attributes":{"category":"taxes","category2":"taxes","description":"Valorlub","factoryDiscount":"none","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"3.00","listPrice":"0.00","name":"valorlub","netPrice":"0.00","qty":"1.00","salesPrice":"0.00"}},{"_attributes":{"category":"taxes","category2":"taxes","description":"Recytyre cat 1A","factoryDiscount":"none","instance":"0","isCostEdited":"false","isLeaf":"true","isNonStandard":"false","isResolved":"false","isSpecialOption":"false","level":"3.00","listPrice":"0.00","name":"recytyre_cat_1A","netPrice":"0.00","qty":"4.00","salesPrice":"0.00"}}]}}]
 

My Code in a NodJs Step in pipedream:

    export default defineComponent({        
    async run({ steps, $ }) {       
            
    //  let recordb = (steps.xml_to_json.$return_value.resource.attributes.attribute[4].items.item.items.item[1].items.item.length)         
    for (let i = 0; i < steps.xml_to_json.$return_value.resource.attributes.attribute[4].items.item.items.item.length; i++) {       
    let record = (steps.xml_to_json.$return_value.resource.attributes.attribute[4].items.item.items.item[i].items.item)         
    if (record !== undefined){      
            console.log(record);        
            
    }//if1      
            
    let lth = steps.xml_to_json.$return_value.resource.attributes.attribute[4].items.item.items.item[i].items.item.length;      
            
    if (lth !== undefined){     
            
    //console.log(steps.xml_to_json.$return_value.resource.attributes.attribute[4].items.item.items.item[i].items.item.length);     
    for (let j = 0; j < steps.xml_to_json.$return_value.resource.attributes.attribute[4].items.item.items.item[i].items.item.length; i++) {                 
    let recordb = (steps.xml_to_json.$return_value.resource.attributes.attribute[4].items.item.items.item[i].items.item[j])         
            
    if (recordb !== undefined){         
            
    console.log(recordb);       
            
    }//if2      
    }//for2     
    }       
    }//for1     
            
            
    //console.log(recordb);     
     },     
    })      

The output:

    { _attributes: { category: 'type', category2: 'type', description: 'L06 AC : 0,6t', factoryDiscount: 'chassi', instance: '0', isCostEdited: 'false', isLeaf: 'true', isNonStandard: 'false', isResolved: 'false', isSpecialOption: 'false', level: '3.00', listPrice: '24736.00', name: '117101-1100-005', netPrice: '11625.92', qty: '1.00', salesPrice: '12615.36' } }
    
    27-12-2022 14:37:39 [ { _attributes: { category: 'wheels', category2: 'wheels', description: 'DW polyurethane with tread', factoryDiscount: 'ancillary', instance: '0', isCostEdited: 'false', isLeaf: 'true', isNonStandard: 'false', isResolved: 'false', isSpecialOption: 'false', level: '3.00', listPrice: '152.00', name: '115202-1640-015', netPrice: '71.44', qty: '1.00', salesPrice: '77.52' } }, { _attributes: { category: 'wheels', category2: 'wheels', description: 'LW Single polyurethane', factoryDiscount: 'ancillary', instance: '0', isCostEdited: 'false', isLeaf: 'true', isNonStandard: 'false', isResolved: 'false', isSpecialOption: 'false', level: '3.00', listPrice: '0.00', name: '115202-1650-005', netPrice: '0.00', qty: '1.00', salesPrice: '0.00' } }, { _attributes: { category: 'mast_options', category2: 'mast_options', description: 'Central lever LLC', factoryDiscount: 'ancillary', instance: '0', isCostEdited: 'false', isLeaf: 'true', isNonStandard: 'false', isResolved: 'false', isSpecialOption: 'false', level: '3.00', listPrice: '0.00', name: '112000-5100-005', netPrice: '0.00', qty: '1.00', salesPrice: '0.00' } }, { _attributes: { category: 'safety', category2: 'safety', description: 'Technical Documentation NL', factoryDiscount: 'ancillary', instance: '0', isCostEdited: 'false', isLeaf: 'true', isNonStandard: 'false', isResolved: 'false', isSpecialOption: 'false', level: '3.00', listPrice: '0.00', name: '117101-7850-040', netPrice: '0.00', qty: '1.00', salesPrice: '0.00' } }, { _attributes: { category: 'safety', category2: 'safety', description: 'RAL 2002 Vermillion', factoryDiscount: 'ancillary', instance: '0', isCostEdited: 'false', isLeaf: 'true', isNonStandard: 'false', isResolved: 'false', isSpecialOption: 'false', level: '3.00', listPrice: '0.00', name: '117101-7900-005', netPrice: '0.00', qty: '1.00', salesPrice: '0.00' } } ]
    
    27-12-2022 14:37:39 { _attributes: { category: 'wheels', category2: 'wheels', description: 'DW polyurethane with tread', factoryDiscount: 'ancillary', instance: '0', isCostEdited: 'false', isLeaf: 'true', isNonStandard: 'false', isResolved: 'false', isSpecialOption: 'false', level: '3.00', listPrice: '152.00', name: '115202-1640-015', netPrice: '71.44', qty: '1.00', salesPrice: '77.52' } }

And get this error: (below)

    TypeError Cannot read property 'item' of undefined
    
    DETAILS at Object.run (file:///tmp/pdg/dist/code/6e17abcbd3b93bd1a5ed7f5b46dabc6403308251df14c794b64e5f9a74ec9378/component.mjs:17:117) at global.executeComponent (/var/task/launch_worker.js:139:53) at MessagePort.messageHandler (/var/task/launch_worker.js:598:28)

Solution

  • Does something like this work?

    Basically, check if the item is an Array or not and either loop over it if it is or else grab the name property.

    output:

    [
      "117101-1100-005",
      "115202-1640-015",
      "115202-1650-005",
      "112000-5100-005",
      "117101-7850-040",
      "117101-7900-005",
      "valorlub",
      "recytyre_cat_1A"
    ]
    

    See full snippet below:

    // console.log(jsonObj);
    
    const itemNames = [];
    
    for (obj of jsonObj) {
      const item = obj?.items?.item;
      // console.log(item);
      if (Array.isArray(item)) {
        for (i of item) {
          const name = i?._attributes?.name;
          if (name) {
            itemNames.push(name);
          }
        }
      }
      else {
        const name = item?._attributes?.name;
        if (name) {
          itemNames.push(name);
        }
      }
    }
    
    console.log(itemNames);
    <script>
    const jsonObj = [
      {
        "_attributes": {
          "category": "type",
          "description": "Chassi",
          "factoryDiscount": "none",
          "instance": "0",
          "isCostEdited": "false",
          "isLeaf": "false",
          "isNonStandard": "false",
          "isResolved": "false",
          "isSpecialOption": "false",
          "level": "2.00",
          "listPrice": "24736.00",
          "name": "chassi",
          "netPrice": "11625.92",
          "qty": "1.00",
          "salesPrice": "12615.36"
        },
        "items": {
          "item": {
            "_attributes": {
              "category": "type",
              "category2": "type",
              "description": "L06 AC : 0,6t",
              "factoryDiscount": "chassi",
              "instance": "0",
              "isCostEdited": "false",
              "isLeaf": "true",
              "isNonStandard": "false",
              "isResolved": "false",
              "isSpecialOption": "false",
              "level": "3.00",
              "listPrice": "24736.00",
              "name": "117101-1100-005",
              "netPrice": "11625.92",
              "qty": "1.00",
              "salesPrice": "12615.36"
            }
          }
        }
      },
      {
        "_attributes": {
          "category": "type",
          "description": "Ancillaries",
          "factoryDiscount": "none",
          "instance": "0",
          "isCostEdited": "false",
          "isLeaf": "false",
          "isNonStandard": "false",
          "isResolved": "false",
          "isSpecialOption": "false",
          "level": "2.00",
          "listPrice": "152.00",
          "name": "ancilleries",
          "netPrice": "71.44",
          "qty": "1.00",
          "salesPrice": "77.52"
        },
        "items": {
          "item": [
            {
              "_attributes": {
                "category": "wheels",
                "category2": "wheels",
                "description": "DW polyurethane with tread",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "152.00",
                "name": "115202-1640-015",
                "netPrice": "71.44",
                "qty": "1.00",
                "salesPrice": "77.52"
              }
            },
            {
              "_attributes": {
                "category": "wheels",
                "category2": "wheels",
                "description": "LW Single polyurethane",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "115202-1650-005",
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            },
            {
              "_attributes": {
                "category": "mast_options",
                "category2": "mast_options",
                "description": "Central lever LLC",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "112000-5100-005",
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            },
            {
              "_attributes": {
                "category": "safety",
                "category2": "safety",
                "description": "Technical Documentation NL",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "117101-7850-040",
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            },
            {
              "_attributes": {
                "category": "safety",
                "category2": "safety",
                "description": "RAL 2002 Vermillion",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "117101-7900-005",
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            }
          ]
        }
      },
      {
        "_attributes": {
          "category": "type",
          "category2": "type",
          "description": "Battery & Charger",
          "factoryDiscount": "none",
          "instance": "0",
          "isCostEdited": "false",
          "isLeaf": "true",
          "isNonStandard": "false",
          "isResolved": "false",
          "isSpecialOption": "false",
          "level": "2.00",
          "listPrice": "0.00",
          "name": "battery_charger",
          "netPrice": "0.00",
          "qty": "1.00",
          "salesPrice": "0.00"
        }
      },
      {
        "_attributes": {
          "category": "taxes",
          "description": "Taxes",
          "factoryDiscount": "none",
          "instance": "0",
          "isCostEdited": "false",
          "isLeaf": "false",
          "isNonStandard": "false",
          "isResolved": "false",
          "isSpecialOption": "false",
          "level": "2.00",
          "listPrice": "0.00",
          "name": "taxes",
          "netPrice": "0.00",
          "qty": "1.00",
          "salesPrice": "0.00"
        },
        "items": {
          "item": [
            {
              "_attributes": {
                "category": "taxes",
                "category2": "taxes",
                "description": "Valorlub",
                "factoryDiscount": "none",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "valorlub",
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            },
            {
              "_attributes": {
                "category": "taxes",
                "category2": "taxes",
                "description": "Recytyre cat 1A",
                "factoryDiscount": "none",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "recytyre_cat_1A",
                "netPrice": "0.00",
                "qty": "4.00",
                "salesPrice": "0.00"
              }
            }
          ]
        }
      }
    ]
    
    </script>

    Or if you potentially want to ignore the last 2 names then you can only append those that match a regex pattern

    output:

    [
      "117101-1100-005",
      "115202-1640-015",
      "115202-1650-005",
      "112000-5100-005",
      "117101-7850-040",
      "117101-7900-005"
    ]
    

    See full snippet below:

    // console.log(jsonObj);
    
    const itemNames = [];
    const re = /^\d{6}-\d{4}-\d{3}$/;
    
    for (obj of jsonObj) {
      const item = obj?.items?.item;
      // console.log(item);
      if (Array.isArray(item)) {
        for (i of item) {
          const name = i?._attributes?.name;
          if (re.test(name)) {
            itemNames.push(name);
          }
        }
      }
      else {
        const name = item?._attributes?.name;
        if (re.test(name)) {
          itemNames.push(name);
        }
      }
    }
    
    console.log(itemNames);
    <script>
    const jsonObj = [
      {
        "_attributes": {
          "category": "type",
          "description": "Chassi",
          "factoryDiscount": "none",
          "instance": "0",
          "isCostEdited": "false",
          "isLeaf": "false",
          "isNonStandard": "false",
          "isResolved": "false",
          "isSpecialOption": "false",
          "level": "2.00",
          "listPrice": "24736.00",
          "name": "chassi",
          "netPrice": "11625.92",
          "qty": "1.00",
          "salesPrice": "12615.36"
        },
        "items": {
          "item": {
            "_attributes": {
              "category": "type",
              "category2": "type",
              "description": "L06 AC : 0,6t",
              "factoryDiscount": "chassi",
              "instance": "0",
              "isCostEdited": "false",
              "isLeaf": "true",
              "isNonStandard": "false",
              "isResolved": "false",
              "isSpecialOption": "false",
              "level": "3.00",
              "listPrice": "24736.00",
              "name": "117101-1100-005", // 1
              "netPrice": "11625.92",
              "qty": "1.00",
              "salesPrice": "12615.36"
            }
          }
        }
      },
      {
        "_attributes": {
          "category": "type",
          "description": "Ancillaries",
          "factoryDiscount": "none",
          "instance": "0",
          "isCostEdited": "false",
          "isLeaf": "false",
          "isNonStandard": "false",
          "isResolved": "false",
          "isSpecialOption": "false",
          "level": "2.00",
          "listPrice": "152.00",
          "name": "ancilleries",
          "netPrice": "71.44",
          "qty": "1.00",
          "salesPrice": "77.52"
        },
        "items": {
          "item": [
            {
              "_attributes": {
                "category": "wheels",
                "category2": "wheels",
                "description": "DW polyurethane with tread",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "152.00",
                "name": "115202-1640-015", // 2
                "netPrice": "71.44",
                "qty": "1.00",
                "salesPrice": "77.52"
              }
            },
            {
              "_attributes": {
                "category": "wheels",
                "category2": "wheels",
                "description": "LW Single polyurethane",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "115202-1650-005", // 3
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            },
            {
              "_attributes": {
                "category": "mast_options",
                "category2": "mast_options",
                "description": "Central lever LLC",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "112000-5100-005", // 4
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            },
            {
              "_attributes": {
                "category": "safety",
                "category2": "safety",
                "description": "Technical Documentation NL",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "117101-7850-040", // 5
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            },
            {
              "_attributes": {
                "category": "safety",
                "category2": "safety",
                "description": "RAL 2002 Vermillion",
                "factoryDiscount": "ancillary",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "117101-7900-005", // 6
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            }
          ]
        }
      },
      {
        "_attributes": {
          "category": "type",
          "category2": "type",
          "description": "Battery & Charger",
          "factoryDiscount": "none",
          "instance": "0",
          "isCostEdited": "false",
          "isLeaf": "true",
          "isNonStandard": "false",
          "isResolved": "false",
          "isSpecialOption": "false",
          "level": "2.00",
          "listPrice": "0.00",
          "name": "battery_charger",
          "netPrice": "0.00",
          "qty": "1.00",
          "salesPrice": "0.00"
        }
      },
      {
        "_attributes": {
          "category": "taxes",
          "description": "Taxes",
          "factoryDiscount": "none",
          "instance": "0",
          "isCostEdited": "false",
          "isLeaf": "false",
          "isNonStandard": "false",
          "isResolved": "false",
          "isSpecialOption": "false",
          "level": "2.00",
          "listPrice": "0.00",
          "name": "taxes",
          "netPrice": "0.00",
          "qty": "1.00",
          "salesPrice": "0.00"
        },
        "items": {
          "item": [
            {
              "_attributes": {
                "category": "taxes",
                "category2": "taxes",
                "description": "Valorlub",
                "factoryDiscount": "none",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "valorlub",
                "netPrice": "0.00",
                "qty": "1.00",
                "salesPrice": "0.00"
              }
            },
            {
              "_attributes": {
                "category": "taxes",
                "category2": "taxes",
                "description": "Recytyre cat 1A",
                "factoryDiscount": "none",
                "instance": "0",
                "isCostEdited": "false",
                "isLeaf": "true",
                "isNonStandard": "false",
                "isResolved": "false",
                "isSpecialOption": "false",
                "level": "3.00",
                "listPrice": "0.00",
                "name": "recytyre_cat_1A",
                "netPrice": "0.00",
                "qty": "4.00",
                "salesPrice": "0.00"
              }
            }
          ]
        }
      }
    ]
    
    </script>