Forum Discussion

wcl3y2's avatar
wcl3y2
New Contributor III
6 years ago
Solved

Is there a way to insert a row number while mapping an object array?

I am creating an integration that will take JSON from our CRM and create invoices in our ERP. One of the required fields is line number for each of the invoice lines. I am trying to generate this in the mapper snap, and I cannot figure out a way. I am really hoping that I don’t have to resort to using a script.

  • I think you can use the .map() method on Array objects to do this since the callback will be passed the current index into the array. The following expression does this:

    $lines.map((elem, index) => { lineNumber: index + 1, ...elem })
    

    The .map() method will iterate over each element in the $lines array and execute the given callback function (the part that starts with (elem, index) =>. The callback function creates a new object with the new lineNumber property and then uses the spread operator (...elem) to add in the properties from the original array element.

    Here’s a pipeline that demonstrates this:

    Community7085_2020_03_16.slp (3.6 KB)

6 Replies

    • wcl3y2's avatar
      wcl3y2
      New Contributor III

      Hello,

      I have tried this, but it doesn’t work. I have a mapper where the mapping root is a nested object array. When I use the property that you talk about, it increments for each invoice, not each invoice line within an invoice.

      For instance, I have a JSON document with 3 invoices with 5 lines each. I have a separate mapper snap for the line item mapping. When I use the snap.in.totalCount property in the line item mapper, it assigns 1 to each line on the first document, 2 to each line on the second document, and 3 to each line on the third document. I want it to assign line numbers 1, 2, 3, 4, and 5 within each invoice.

      • Ajay_Chawda's avatar
        Ajay_Chawda
        Contributor

        Hi,
        can you share input and expected output that your are looking.

        Regards,
        Ajay Chawda

  • wcl3y2's avatar
    wcl3y2
    New Contributor III

    Sure, here is a simplified version:

    Input:

    [{
    “invoiceNum”: “12345”,
    “total”: 100,
    “lines”: [{
    “qty”: 1,
    “unit”: 50,
    “extended”: 50
    },
    {
    “qty”: 2,
    “unit”: 25,
    “extended”: 50
    }],

    },
    {
    “invoiceNum”: “12346”,
    “total”: 150.56,
    “lines”: [{
    “qty”: 1,
    “unit”: 50.56,
    “extended”: 50.56
    },
    {
    “qty”: 1,
    “unit”: 50,
    “extended”: 50
    },
    {
    “qty”: 2,
    “unit”: 25,
    “extended”: 50
    }],
    }]

    Output:

    [{
    “invoiceNum”: “12345”,
    “total”: 100,
    “lines”: [{
    “lineNumber”: 1,
    “qty”: 1,
    “unit”: 50,
    “extended”: 50
    },
    {
    “lineNumber”: 2,
    “qty”: 2,
    “unit”: 25,
    “extended”: 50
    }],

    },
    {
    “invoiceNum”: “12346”,
    “total”: 150.56,
    “lines”: [{
    “lineNumber”: 1,
    “qty”: 1,
    “unit”: 50.56,
    “extended”: 50.56
    },
    {
    “lineNumber”: 2,
    “qty”: 1,
    “unit”: 50,
    “extended”: 50
    },
    {
    “lineNumber”: 3,
    “qty”: 2,
    “unit”: 25,
    “extended”: 50
    }],
    }]

    • tstack's avatar
      tstack
      Former Employee

      I think you can use the .map() method on Array objects to do this since the callback will be passed the current index into the array. The following expression does this:

      $lines.map((elem, index) => { lineNumber: index + 1, ...elem })
      

      The .map() method will iterate over each element in the $lines array and execute the given callback function (the part that starts with (elem, index) =>. The callback function creates a new object with the new lineNumber property and then uses the spread operator (...elem) to add in the properties from the original array element.

      Here’s a pipeline that demonstrates this:

      Community7085_2020_03_16.slp (3.6 KB)

      • wcl3y2's avatar
        wcl3y2
        New Contributor III

        That did the trick. Thank you!