Appian Community and Appian Academy are being upgraded. As a part of the upgrade, Appian Community is currently in read-only mode, and user registration is disabled until August 3. We apologize for any inconvenience this may cause, but a more secure, stable, and performant Community experience is coming soon!

The new Appian Community launches August 3, followed by Appian Academy on August 7. During the migration, Appian Community Edition, Appian Academy, Documentation, Certifications, Instructor-led Customer Training, Partner Sales Training & Accreditation, and Forum (for Appian Partners and Customers only) will remain available.

How to filter not null data from list of dictionary ?

Hi Team,

I need help.

I have a list of  dictionary like

{

{name: "Aish", category: "A"}

{name: "Jenny", category: "A"}

{name: "", category: "C"}

{name: "", category: "E"}

{name: "", category: "E"}

}

Now I want to filter out only that/those dictionary which has name value not null. 

Like I want values to return only with name filled, empty rows I don't want.

In the example above it should return only first 2 rows as the name is filled there.

can you suggest anything?

  Discussion posts and replies are publicly visible

  • Typically you'd conduct a 2-stage process in your expression:

    1. loop through each of the items in your array, examine each and where the 'name' is null, return null, other wise return the whole item. You can do this using a!forEach()
    2. on the result from 1. use fn!reject() to remove all of the values that are now null

    Here's the full code:

    a!localVariables(
      local!myArray: {
        { name: "Aish", category: "A" },
        { name: "Jenny", category: "A" },
        { name: "", category: "C" },
        { name: "", category: "E" },
        { name: "", category: "E" }
      },
      fn!reject(
        fn!isnull,
        a!forEach(
          items: local!myArray,
          expression: if(fv!item.name = "", null, fv!item)
        )
      )
    )

    ...and the result is:

  • 0
    Certified Lead Developer
    in reply to Stewart Burchell

    Since I loathe the the old looping functions with a fiery passion these days, I would recommend just utilizing a!forEach() for the heavy lifting here.  The trick is, have it return an empty set instead of NULL, which in normal circumstances will not be returned as a member of the resulting array.  The one corner case is, for some quirky reason if all items are filtered out, then the result ends up returning a list of empty sets equal in length to the original list, but a!flatten takes care of this handily.

    a!localVariables(
      local!myArray: {
        { name: "Aish", category: "A" },
        { name: "Jenny", category: "A" },
        { name: "", category: "C" },
        { name: "", category: "E" },
        { name: "", category: "E" }
      },
      
      a!flatten( 
      /* (a!flatten only becomes necessary when the filter would
          cause zero results to be returned) */
        a!forEach(
          items: local!myArray,
          expression: if(
            isnull(fv!item.name),
            {},
            fv!item
          )
        )
      )
      
      /*fn!reject(*/
        /*fn!isnull,*/
        /*a!forEach(*/
          /*items: local!myArray,*/
          /*expression: if(fv!item.name = "", null, fv!item)*/
        /*)*/
      /*)*/
    )

  • 0
    Certified Associate Developer
    in reply to Stewart Burchell

    Great! Thank you for your answer!