51

I need to filter out my array to contain only unique values. this is my array data

["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"] 

expected result should be

["X_row7", "X_row4", "X_row6", "X_row10", "X_row11", "X_row8", "X_row9"] 

How should i continue my code to get proper result.

newArray = []; for(n in data){ if(!newArray.indexOf(n)){ newArray.push(n); } } console.log(newArray); 

If you need any additional information's please let me know and i will provide. thank you

3
  • 1
    ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"].filter(function(v,i,arr){ return i==arr.indexOf(v); }) Commented Jul 5, 2016 at 15:11
  • Please double-check your expected output - why isn't X_row9 included? Commented Aug 9, 2019 at 4:47
  • using loop: var x = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10"]; let itm =[]; for (let i = 0; i < x.length; i++) { let element = x[i]; if(i === x.indexOf(element)) { itm.push(element) } } console.log("item", itm); Commented Mar 6, 2021 at 6:28

11 Answers 11

101

You can use Array.filter function to filter out elements of an array based on the return value of a callback function. The callback function runs for every element of the original array.

The logic for the callback function here is that if the indexOf value for current item is same as the index, it means the element has been encountered first time, so it can be considered unique. If not, it means the element has been encountered already, so should be discarded now.

var arr = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]; var filteredArray = arr.filter(function(item, pos){ return arr.indexOf(item)== pos; }); console.log( filteredArray );

Caveat: As pointed out by rob in the comments, this method should be avoided with very large arrays as it runs in O(N^2).

UPDATE (16 Nov 2017)

If you can rely on ES6 features, then you can use Set object and Spread operator to create a unique array from a given array, as already specified in @Travis Heeter's answer below:

var uniqueArray = [...new Set(array)] 
Sign up to request clarification or add additional context in comments.

1 Comment

The original ES5 solution is O(N^2) so make sure your arrays aren't too big if you're using that.
43

As of June 15, 2015 you may use Set() to create a unique array:

var uniqueArray = [...new Set(array)] 

For your Example:

var data = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"] var newArray = [...new Set(data)] console.log(newArray) >> ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"] 

Comments

17

Filtering an array to contain unique values can be achieved using the JavaScript Set and Array.from method, as shown below:

Array.from(new Set(arrayOfNonUniqueValues));

Set

The Set object lets you store unique values of any type, whether primitive values or object references.

Return value A new Set object.

Array.from()

The Array.from() method creates a new Array instance from an array-like or iterable object.

Return value A new Array instance.

Example Code:

const array = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"] const uniqueArray = Array.from(new Set(array)); console.log("uniqueArray: ", uniqueArray);

Comments

7

arr = ["I", "do", "love", "JavaScript", "and", "I", "also", "do", "love", "Java"]; uniqueArr = [... new Set(arr)]; // or reallyUniqueArr = arr.filter((item, pos, ar) => ar.indexOf(item) === pos) console.log(`${uniqueArr}\n${reallyUniqueArr}`)

1 Comment

Please provide context to the code
7

You could use a hash table for look up and filter all not included values.

var data = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"], unique = data.filter(function (a) { return !this[a] && (this[a] = true); }, Object.create(null)); console.log(unique);

Comments

6
Array.prototype.unique = function () { return [...new Set(this)] } 

then we can write:

const arr = [1, 5, 2, 2, 2, 3, 4, 3, 2, 1, 5] const uniqueArr = arr.unique() 

2 Comments

Nice concise solution, it works great! When I try as Array.prototype.unique = () => [...new Set(this)];, I get "Uncaught (in promise) TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator))". Any ideas? Thanks!
Because this refer to window when you use arrow function, but refer to the array when you use normal function.
5

You can use Map and Spread Operator:

var rawData = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]; var unique = new Map(); rawData.forEach(d => unique.set(d, d)); var uniqueItems = [...unique.keys()]; console.log(uniqueItems);

Comments

4

You can use reduce to loop the array and get the not duplicate values. Also uses an aux object to get the count of added values.

var aux = {}; var newArray = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"].reduce((tot, curr)=>{ if(!aux[curr]){ aux[curr] = 1; tot.push(curr); } return tot; }, []); console.log(newArray);

Comments

4

This is for es2015 and above as far as I know. There are 'cleaner' options with ES6 but this a great way to do it (with TypeScript).

let values: any[] = []; const distinct = (value: any, index: any, self: any) => { return self.indexOf(value) === index; }; values = values.filter(distinct); 

Comments

3

A slight variation on the indexOf method, if you need to filter multiple arrays:

function unique(item, index, array) { return array.indexOf(item) == index; } 

Use as such:

arr.filter(unique); 

Comments

2

I've always used:

unique = (arr) => arr.filter((item, i, s) => s.lastIndexOf(item) == i); 

But recently I had to get unique values for:

["1", 1, "2", 2, "3", 3] 

And my old standby didn't cut it, so I came up with this:

uunique = (arr) => Object.keys(Object.assign({}, ...arr.map(a=>({[a]:true})))); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.