Assuming I have the following:
var array =
[
{"name":"Joe", "age":17},
{"name":"Bob", "age":17},
{"name":"Carl", "age": 35}
]
What is the best way to be able to get an array of all of the distinct ages such that I get an result array of:
[17, 35]
Is there some way I could alternatively structure the data or better method such that I would not have to iterate through each array checking the value of "age" and check against another array for its existence, and add it if not?
If there was some way I could just pull out the distinct ages without iterating...
Current inefficent way I would like to improve... If it means that instead of "array" being an array of objects, but a "map" of objects with some unique key (i.e. "1,2,3") that would be okay too. Im just looking for the most performance efficient way.
The following is how I currently do it, but for me, iteration appears to just be crummy for efficiency even though it does work...
var distinct = []
for (var i = 0; i < array.length; i++)
if (array[i].age not in distinct)
distinct.push(array[i].age)
i think you are looking for groupBy function (using Lodash)
produces result:
jsFiddle demo:http://jsfiddle.net/4J2SX/201/
If this were PHP I'd build an array with the keys and take
array_keys
at the end, but JS has no such luxury. Instead, try this:Just found this and I thought it's useful
Again using underscore, so if you have an object like this
it will give you the unique objects only.
What happens here is that
indexBy
returns a map like thisand just because it's a map, all keys are unique.
Then I'm just mapping this list back to array.
In case you need only the distinct values
Keep in mind that the
key
is returned as a string so, if you need integers instead, you should doJust try
I'd just map and remove dups:
Edit: Aight! Not the most efficient way in terms of performance, but the simplest most readable IMO. If you really care about micro-optimization or you have huge amounts of data then a regular
for
loop is going to be more "efficient".