expr-eval icon indicating copy to clipboard operation
expr-eval copied to clipboard

How to transform object in mapper function

Open VincentdeWit94 opened this issue 3 years ago • 3 comments

Would it be possible to create a mapper function that returns a new object with new values? Like we would do in JS:

.map((d) => ({a: d.alpha, b: d.beta})); Which would return: { a: 'alpha_val', b: 'beta_val' }

Thanks!

VincentdeWit94 avatar Apr 25 '21 21:04 VincentdeWit94

I'm not sure I understand the context for this. Can you add an example of how it would work with an expression?

silentmatt avatar Apr 27 '21 14:04 silentmatt

Hi Matt,

Thanks! Yeah sure....

I see that your expression language supports the use of a mapping function through map(f, a). If you pass a regular array of objects through that map function and directly return a, it will return the inputted array of objects. What I would like to do, is to manipulate an attribute of the objects in the array, so let's say I have this array of objects:

[{ high: 1, low: 0 }, { high: 1, low: 0 }]

And I want to manipulate the high value in each object with a + 1, would I be possible to do that with the map function to return the array of objects with the manipulated objects? Like this:

f(o) = o.high+1; map(f, arrayOfObjects)

[{ high: 2, low: 0 }, { high: 2, low: 0 }]

Thanks!

VincentdeWit94 avatar Apr 27 '21 14:04 VincentdeWit94

Thanks, I see what you mean now. Support for objects right now is pretty limited, so I don't see a way to do that. It is possible with a JavaScript function that you pass into the expression (or add to the parser.functions object). I'll add an example below in case it helps. It would be useful to be able to do something similar "in-language" though, so I'll start thinking about how it would be implemented.

const parser = new Parser();
const arrayOfObjects = [{ high: 1, low: 0}, {high: 1, low: 0 }];
const scope = { arrayOfObjects: arrayOfObjects, f: (o) => ({ ...o, high: o.high + 1 }) };
parser.evaluate('map(f, arrayOfObjects)', scope);

silentmatt avatar Apr 27 '21 14:04 silentmatt