Hi there
I'm working on a server side pagination and I'm trying to order a query by a specific value (which is a table.sortedColumn value)
Problem is : I don't know how to use transformers.
Here's the idea of what I'm trying to achieve (with lots of mistakes)
let data = {{query.data}}
let order = {{table1.sortedColumn}}
let filtered = data.sort(x=>x.order)
return filtered
Hi @webloomers
you should change the line with something like:
let filtered = data.sort((a,b) => a[order]-b[order])
Array.sort optionally accepts a comparator function to evaluate your custom parameter.
If order
is a number, then a[order]-b[order]
results in ascending ordered array and b[order]-a[order]
a descending one.
You can add more logic in that function if you need.
Hope this help
Hi abusedmedia, thanks for your quick reply, unfortunately it doesn't seem to work
Here's the whole code with your suggested edit
let data = {{query.data}}
let order = {{table1.sortedColumn}}
let filtered = data.sort((a,b) => a[order]-b[order])
return filtered
It doesn't seem to order anything. I tested with a static value for order for testing purposes and it doesn't work either. Query stays on its default order (first column).
Hi @webloomers
you are right, the transformer had further issues.
Here a working code using the default query of a blank project returning a sorted array based on an arbitrary parameter:
const order = 'quantity'
return formatDataAsArray(data).sort((a,b) => a[order]-b[order])
You can see that data
is a reserved keywork that represents the original query.data
and, since sort
is an Array method, formatDataAsArray
is required if the original source is a map.
Hope this help
@abusedmedia my data was already an array so it's not that. Your initial suggestion does show run correctly, just not filtered as planned
Update : for some reason this other approach works
let order = {{ table1.sortedColumn }}
sortedArray = data.sort((a, b) => a[order].localeCompare(b[order]))
return sortedArray
How would you then order DESC or ASC if clicking on the same event handler twice and/or repeatedly ?
Nevermind I found the solution for my last question. For those of you interested, there is a property called table1.sort['0'].desc (true or false) so I just had to add some conditioning.
Thank you so much for your support.
Good to hear you've solved!
By using localeCompare
for the comparison means that your param value is a string
type instead of a number
.
Cheers.