patternjavascriptCritical
Get all unique values in a JavaScript array (remove duplicates)
Viewed 0 times
arrayuniqueremoveduplicatesvaluesalljavascriptget
Problem
I have an array of numbers that I need to make sure are unique. I found the code snippet below on the Internet, and it works great until the array has a zero in it. I found this other script here on Stack Overflow that looks almost exactly like it, but it doesn't fail.
How can I determine where the prototype script is going wrong?
How can I determine where the prototype script is going wrong?
Array.prototype.getUnique = function() {
var o = {}, a = [], i, e;
for (i = 0; e = this[i]; i++) {o[e] = 1};
for (e in o) {a.push (e)};
return a;
}Solution
With JavaScript 1.6 / ECMAScript 5 you can use the native
The native method
This solution works without any extra library like jQuery or prototype.js.
It works for arrays with mixed value types too.
For old Browsers (filter and indexOf.
If you want to keep the last occurrence of a value, simply replace
With ES6 this can be shorten to:
Thanks to Camilo Martin for hint in comment.
ES6 has a native object
The constructor of
filter method of an Array in the following way to get an array with unique values:function onlyUnique(value, index, array) {
return array.indexOf(value) === index;
}
// usage example:
var a = ['a', 1, 'a', 2, '1'];
var unique = a.filter(onlyUnique);
console.log(unique); // ['a', 1, 2, '1']
The native method
filter will loop through the array and leave only those entries that pass the given callback function onlyUnique.onlyUnique checks, if the given value is the first occurring. If not, it must be a duplicate and will not be copied.This solution works without any extra library like jQuery or prototype.js.
It works for arrays with mixed value types too.
For old Browsers (filter and indexOf.
If you want to keep the last occurrence of a value, simply replace
indexOf with lastIndexOf.With ES6 this can be shorten to:
// usage example:
var myArray = ['a', 1, 'a', 2, '1'];
var unique = myArray.filter((value, index, array) => array.indexOf(value) === index);
console.log(unique); // unique is ['a', 1, 2, '1']
Thanks to Camilo Martin for hint in comment.
ES6 has a native object
Set to store unique values. To get an array with unique values you could now do this:var myArray = ['a', 1, 'a', 2, '1'];
let unique = [...new Set(myArray)];
console.log(unique); // unique is ['a', 1, 2, '1']
The constructor of
Set takes an iterable object, like an Array, and the spread operator ... transform the set back into an Array. Thanks to Lukas Liese for hint in comment.Context
Stack Overflow Q#1960473, score: 4733
Revisions (0)
No revisions yet.