Hello Folks,
I’m trying to sort an array row-wise. The array contains coordinate points (x, y). I tried to sort the array but I am not getting the expected result. Any help will be highly appreciated.
Link to my notebook: Sorting elements in an Array / JS | Observable
Expected outcome
SortedArray = Array(2) [
0: Array(3)
[0: Object{x: 56.71095406360424, y: 60.00740978691508}
1: Object {x: 173, y: 52.6015625}
2: Object {x: 306, y: 49.6015625}
]
1: Array(3) [
0: Object {x: 50.02022114840451, y: 194.40599016150796}
1: Object {x: 176.21168146293346, y: 186.11935655209044}
2: Object {x: 296.82501974946393, y: 182.13051574314412}
]
]
Thanks a lot!
Try the following:
ExampleArray.sort((a, b) => a.y - b.y || a.x - b.x)
1 Like
@mootari Thanks a lot! It worked but still has some issues. Indexes are not correct order. Find my output below.
SortedArray = Array(2) [
0: Array(3) [
0: Object {x: 306, y: 49.6015625}
1: Object {x: 173, y: 52.6015625}
2: Object {x: 56.71095406360424, y: 60.00740978691508}
]
1: Array(3) [
0: Object {x: 296.82501974946393, y: 182.13051574314412}
1: Object {x: 176.21168146293346, y: 186.11935655209044}
2: Object {x: 50.02022114840451, y: 194.40599016150796}
]
]
Seems I forgot to swap x and y. I’ll leave that as an exercise to you.
If I swap x and y, points_array.sort((a, b) => a.x - b.x || a.y - b.y)
, I am getting something like below, but this is not the result I’m expecting. BTW thanks a lot for your suggestions. I’m trying to tweak it a little bit.
SortedArray = Array(2) [
0: Array(3) [
0: Object {x: 50.02022114840451, y: 194.40599016150796}
]
1: Object {x: 56.71095406360424, y: 60.00740978691508}
2: Object {x: 173, y: 52.6015625}
]
1: Array(3) [
0: Object {x: 176.21168146293346, y: 186.11935655209044}
1: Object {x: 296.82501974946393, y: 182.13051574314412}
2: Object {x: 306, y: 49.6015625}
]
Your array slicing aside, the order looks correct to me. I’m not sure what result you expect.
If I swap x and y, mostly points are sorted based on x or y, but I am expecting result should be like this (if I don’t apply slicing).
Array[6] [
0: Object {x: 56.71095406360424, y: 60.00740978691508}
1: Object {x: 173, y: 52.6015625}
2: Object {x: 306, y: 49.6015625}
3: Object {x: 50.02022114840451, y: 194.40599016150796}
4: Object {x: 176.21168146293346, y: 186.11935655209044}
5: Object {x: 296.82501974946393, y: 182.13051574314412}
]
We already discussed the topic at length in Organize centroid points into Array Structure - #6 by mootari where I even gave a solution for this sort of binning. Why have you created this new topic?
1 Like
That partially solved my issue. After slicing, the array index for the second row is just reversed. So, I am thinking about a better solution.
@mootari Thanks a lot! Your code helped me to solve my issue. Thanks a lot once again!