Skip to content

For Loop Array Declaration after recursive function def not compiling #365

@samer1977

Description

@samer1977

Hi,
I know the title sounds confusing but hopefully my explanation will be clearer. This is based on this post which I resolved. However I had a second thought and I figured that this would be better done using group-by function! Its not going to save us much lines of code but it would probably look cleaner.

Going through the exercise I encountered strange error. lets assume for now that the end result will be an array of of objects, here is the spec which wont compile:


import "http://jslt.schibsted.com/2018/experimental" as exp
def collapse-objects(array)
  if(not(is-array($array)))
    $array
  else if(size($array)==1)
    $array[0]
  else
    $array[-1]+collapse-objects($array[0 : -1])

[for (exp:group-by(., .name, {.date:.height}))  {.key: collapse-objects(.values)} ]

Running the above will give me the scariest error of all :

com.schibsted.spt.data.jslt.JsltException: Parse error: Encountered " "for" "for "" at line 10, column 2 ....
...

However if I store the array def in a variable and return the variable as in the below it works!!

let result = [for (exp:group-by(., .name, {.date:.height}))  {.key: collapse-objects(.values)} ]
$result

My question why is that? am I missing something or is the parser not able to tell the end of the function from what is being returned?

By the way if I change the result from being an array to complex object - which is what is expected in the post - it works too without having to declare a variable !!

{for (exp:group-by(., .name, {.date:.height})) .key: collapse-objects(.values)}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions