Getting One Property Value From Dictionary Based Upon Another Property Value

I have this expression rule and I need to get the value of one of the keys based upon whether another key property is true or false, I have this but doesn't work:

a!localVariables(
  local!myDictionary: {
    {
    item: 1,
    active: true,
    description: "Widget",
    color: "Green"}
    ,{
    item: 2,
    active:false,
    description: "another",
    color: "red"}
  },
  if(
  fn!index(local!myDictionary,"active","") == true,
    fn!index(local!myDictionary,"color",null), "")
)

To explain further: I would want to return the value "Green" from the key property color due to active property being true and not the value "red" because active property is false.

  Discussion posts and replies are publicly visible

Parents
  • +1
    Certified Lead Developer

    Close. There are a couple of notes. You should use a!map() instead of dictionaries to help resolve typing mismatch errors. With a dictionary you are probably getting a compare error with a list of variant and boolean. so that line should be more like 

    if(toboolean(fn!index(local!myDictionary,"active","")),

    Note: "if(predicate = true," and "if(predicate," are logically the same

    Line 15 will give you a boolean array of the indices where "active" is true, but wherever you return false, you will get "" returned, so your snippet would return {"Green", ""}. You could store this result and filter out the nulls using filter() or a!forEach(), but I would write this like:

    a!localVariables(
      local!myDictionary: {
        a!map(
          item: 1,
          active: true,
          description: "Widget",
          color: "Green"
        ),
        a!Map(
          item: 2,
          active:false,
          description: "another",
          color: "red"
        )
      },
      index(local!myDictionary.color, where(local!myDictionary.active), {})
    )

Reply
  • +1
    Certified Lead Developer

    Close. There are a couple of notes. You should use a!map() instead of dictionaries to help resolve typing mismatch errors. With a dictionary you are probably getting a compare error with a list of variant and boolean. so that line should be more like 

    if(toboolean(fn!index(local!myDictionary,"active","")),

    Note: "if(predicate = true," and "if(predicate," are logically the same

    Line 15 will give you a boolean array of the indices where "active" is true, but wherever you return false, you will get "" returned, so your snippet would return {"Green", ""}. You could store this result and filter out the nulls using filter() or a!forEach(), but I would write this like:

    a!localVariables(
      local!myDictionary: {
        a!map(
          item: 1,
          active: true,
          description: "Widget",
          color: "Green"
        ),
        a!Map(
          item: 2,
          active:false,
          description: "another",
          color: "red"
        )
      },
      index(local!myDictionary.color, where(local!myDictionary.active), {})
    )

Children