Need to manipulate the array

Certified Associate Developer

local!data: {
{ name: "John", status: "Active", test: 10 },
{ name: "John", status: null, test: 4 },
{ name: "Alice", status: "Active", test: 5 },
{ name: "Alice", status: null, test: 6 },
{ name: "Bob", status: null, test: 8 }
}

This a the above data now my requirement is remove null status only for the duplicate name and transfer the test value to the non-null status.

Can any one please help me with this.

  Discussion posts and replies are publicly visible

  • 0
    Certified Senior Developer

    hi,

    So you want to remove the duplicate null with null status right. Hope the code will help

    a!localVariables(
      local!data: {
        { name: "John", status: "Active", test: 10 },
        { name: "John", status: null, test: 4 },
        { name: "Kiran",status: null, test: 10},
        { name: "Kiran",status: "Active", test: 10},
        { name: "Alice", status: "Active", test: 5 },
        { name: "Alice", status: null, test: 6 },
        { name: "Bob", status: null, test: 8 }
      },
      local!uniqueNames:union(index(local!data,"name",null),index(local!data,"name",null)),
      local!DuplicateUsers:reject(fn!isnull,a!forEach(
        items: local!uniqueNames,
        expression: if(
          count(wherecontains(touniformstring(fv!item),touniformstring(index(local!data,"name",null))))>1,
          fv!item,
          null()
        )
      )),
      local!duplicateUserIndexes:index(local!data,wherecontains(
        touniformstring(local!DuplicateUsers),
        touniformstring(index(local!data,"name",null))
      ),null),
      reject(fn!isnull,a!forEach(
        items: local!duplicateUserIndexes,
        expression: if(
          touniformstring(index(fv!item,"status",null))=touniformstring(null),
          null,
          fv!item
        )
      ))
    )

  • I'm not sure how this use case has come about but it appears to me that something has gone wrong to require doing this manipulation. I don't feel good about the below solution because it relies on too many assumptions and just feels flimsy. Having said that, I hope the below helps.

    I think this is the output you are looking for:

    {
        { name: "John", status: "Active", test: 4},
        { name: "Alice", status: "Active", test: 6},
        { name: "Bob", status: null, test: 8}
    }

    The code:

    a!localVariables(
      local!data: {
        { name: "John", status: "Active", test: 10 },
        { name: "John", status: null, test: 4 },
        { name: "Alice", status: "Active", test: 5 },
        { name: "Alice", status: null, test: 6 },
        { name: "Bob", status: null, test: 8 }
      },
      a!forEach(
        items: local!data,
        expression: a!localVariables(
          local!name: index(
            fv!item,
            "name",
            {}
          ),
          local!status: index(
            fv!item,
            "status",
            {}
          ),
          local!indexesWhereNameMatches: where(
            local!name = index(
              local!data,
              "name",
              {}
            )
          ),
          local!hasDuplicate: length(local!indexesWhereNameMatches) > 1,
          /*Assume only one duplicate is possible*/
          local!duplicateIndex: if(
            local!hasDuplicate,
            difference(
              local!indexesWhereNameMatches,
              fv!index
            ),
            {}
          ),
          /*Assume duplicate will always have null status and therefore to use that test value*/
          local!testValueToUse: if(
            local!hasDuplicate,
            index(
              index(
                index(
                  local!data,
                  local!duplicateIndex,
                  {}
                ),
                "test",
                {}
              ),
              1,
              {}
            ),
            index(
              fv!item,
              "test",
              {}
            )
          ),
          local!statusIsNull: a!isNullOrEmpty(local!status),
          local!replaceTestValue: and(
            local!hasDuplicate,
            not(local!statusIsNull)
          ),
          local!removeIndex: and(
            local!statusIsNull,
            local!hasDuplicate
          ),
          local!allDetailsNeeded: a!map(
            name: local!name,
            status: local!status,
            hasDuplicate: local!hasDuplicate,
            statusIsNull: local!statusIsNull,
            replaceTestValue: local!replaceTestValue,
            testValueToUse: local!testValueToUse,
            removeIndex: local!removeIndex
          ),
          if(
            local!removeIndex,
            {},
            a!update(
              data: fv!item,
              index: "test",
              value: local!testValueToUse
            )
          )
        )
      )
    )

  • 0
    Certified Lead Developer

    Assuming this is the output you were looking for:

    {
        "name": "John",
        "status": 10,
        "test": null
    },
    {
        "name": "Alice",
        "status": 5,
        "test": null
    },
    {
        "name": "Bob",
        "status": null,
        "test": 8
    }

    This will:

    • Remove any duplicate items with a status of null
    • Transfer the test value for any values that have a non-null status

    a!localVariables(
      local!data: {
        { name: "John", status: "Active", test: 10 },
        { name: "John", status: null, test: 4 },
        { name: "Alice", status: "Active", test: 5 },
        { name: "Alice", status: null, test: 6 },
        { name: "Bob", status: null, test: 8 }
      },
      local!cleanData: a!forEach(
        items: local!data,
        expression: a!localVariables(
          local!dataWithoutCurrentItem: remove(local!data, fv!index),
          local!hasDuplicates: count(
            index(
              local!dataWithoutCurrentItem,
              wherecontains(
                fv!item.name,
                local!dataWithoutCurrentItem.name
              )
            )
          ) > 0,
          if(
            and(
              local!hasDuplicates,
              a!isNullOrEmpty(fv!item.status)
            ),
            null,
            if(
              a!isNotNullOrEmpty(fv!item.status),
              a!map(
                name: fv!item.name,
                status: fv!item.test,
                test: null
              ),
              fv!item
            )
          )
        )
      ),
      reject(a!isNullOrEmpty, local!cleanData)
    )