Hi,
I am looking to create an arcade expression that compares values from multiple fields and returns the highest values.
However, some fields have identical values.
Hopefully my example below better explains the issue
The data layer might contain the following 5 colour fields. With corresponding values.
Blue Green Yellow Orange Red
6 8 2 8 8
And what I would like returned is Green, Orange, Red
Any help would be greatly appreciated, thanks
Solved! Go to Solution.
If I am understanding this correctly, you want the expression to return all colours whose value is equal to the maximum value. This could be a single colour, or multiple, if there are ties.
Finding the max value is easy enough:
var colour_values = [
$feature.blue,
$feature.green,
$feature.yellow,
$feature.orange,
$feature.red
]
var max_val = Max(colour_values)
But then once you get the value, what do you do with it?
A simple approach is to just get the index positions of the maximum values, then decode those back to the names. Matching values can be pushed to an array, and we can use Concatenate to format the array as a nice string.
var top_colours = []
for (var v in colour_values){
if (colour_values[v] == max_val){
var colour_name = Decode(
v,
0, 'Blue',
1, 'Green',
2, 'Yellow',
3, 'Orange',
4, 'Red',
''
)
Push(top_colours, colour_name)
}
}
return Concatenate(top_colours, ', ')
Here's the output from manually entering your example values:
If I am understanding this correctly, you want the expression to return all colours whose value is equal to the maximum value. This could be a single colour, or multiple, if there are ties.
Finding the max value is easy enough:
var colour_values = [
$feature.blue,
$feature.green,
$feature.yellow,
$feature.orange,
$feature.red
]
var max_val = Max(colour_values)
But then once you get the value, what do you do with it?
A simple approach is to just get the index positions of the maximum values, then decode those back to the names. Matching values can be pushed to an array, and we can use Concatenate to format the array as a nice string.
var top_colours = []
for (var v in colour_values){
if (colour_values[v] == max_val){
var colour_name = Decode(
v,
0, 'Blue',
1, 'Green',
2, 'Yellow',
3, 'Orange',
4, 'Red',
''
)
Push(top_colours, colour_name)
}
}
return Concatenate(top_colours, ', ')
Here's the output from manually entering your example values:
That worked wonders, thank you Josh
I had written code that worked, but I used an array formatted like this:
var myArray = ["Blue:"+$feature.Blue,"Yellow:"+$feature.Yellow...]
So the array looked like this example: ["Blue:2","Yellow:5","Green:9","Orange:9","Red:8"]
Using this method I had to use Left, and Right, Find, and Count functions to parse the array values, Yuck.
That Decode function! Wow what a game changer! Not sure how I missed knowing about it, but that is very cool. Thanks for that.
Decode is a great function to work into your expressions. Feels like every month or so there's an Arcade function that somehow I never learned about, and I realize I've been doing things inefficiently!
I'd thought about a slightly different way of approaching this issue using an array of dictionaries, actually, and your expression sort of looked like it.
var colours = [
{colour:'Blue', value:3},
{colour:'Green', value:5},
...
]
And then using array-specific functions to sort and filter.
If you use the Max expression for numeric fields, the label will return the max value. For example, in my cities feature class I have 2 numeric fields, Xcoord and Ycoord. If I type Max($feature.Xcoord,$feature.Ycoord) for the expression, the label drawn on the map returns the highest value. See this Esri Community response for more details.