4

I want to remove elements that occurr more than once and get the unique element. The array always has 3 elements. Lets say i have an array [2,3,2], then I need to get 3 which is only unique in the array(removing both 2s, because they occur more than once).

I have tried with following code, but surely it doesnot work as expected.

var firstArrTemp = [2,3,2]; var sorted_arr = firstArrTemp.sort(); var unique_element; for (var i = 0; i < sorted_arr.length - 1; i++) { if (sorted_arr[i + 1] != sorted_arr[i]) { unique_element=sorted_arr[i]; } } alert(unique_element); 

Thanks!

4
  • @Vohuman, No this is not duplicate, the page you refered gives 2,3 as a resulting array, I just want to get 3, removing both 2s. Please read question carefully before marking as duplicate Commented Oct 21, 2014 at 11:31
  • @vohuman: That's not what this question needs. This question asks for a result that contains all elements that are unique. Commented Oct 21, 2014 at 11:31
  • @Johan, that is not what i want, please read the post again Commented Oct 21, 2014 at 11:34
  • What about when array is [1,2,3] should return [1,2,3]? Commented Oct 21, 2014 at 11:36

10 Answers 10

8

This should do the trick:

Array.prototype.getUnique = function(){ var uniques = []; for(var i = 0, l = this.length; i < l; ++i){ if(this.lastIndexOf(this[i]) == this.indexOf(this[i])) { uniques.push(this[i]); } } return uniques; } // Usage: var a = [2, 6, 7856, 24, 6, 24]; alert(JSON.stringify(a.getUnique())); console.log(a.getUnique()); // [2, 7856]

To check if a specific item is unique in the array, it just checks if the first index it's found at, matches the last index it's found at.

Sign up to request clarification or add additional context in comments.

3 Comments

Thats the exact answer. Thanks buddy!
This is fine for small arrays, but if your array has a large number of elements, this may get pretty slow.
I completely forgot I had an answer in here. If you know of a faster solution, please answer :-)
3

One alternative with filter() function:

var myArray = [1,2,3,2,2,4,3,7,3].sort(); var uniqueValues = myArray.filter(function(item, i, arr) { return (item !== arr[i-1] && item !== arr[i+1]); }); 

Where uniqueValues = [1,4,7]

2 Comments

Sure, this works. However, sorting an array and then iterating over it again seems like double work.
I'm not sure whether I created the perfomance test case completely right (at least I tried), but here are the results: jsperf.com/remove-uniques . Not proving anything, but I don't see first sorting then filtering a real problem (or as double work).
3

The other answers so far all have O(n log n) time complexity or worse. This can be done in O(n) time though the use of Sets (Set.has has O(1) complexity) instead of nested loops:

// .sort has complexity O(n log n): it's not needed here, avoid it const getOnlyUniques = (arr) => { const foundOnce = new Set(); const foundTwice = new Set(); arr.forEach((item) => { if (foundOnce.has(item)) { foundTwice.add(item); } foundOnce.add(item); }); return arr.filter(item => !foundTwice.has(item)); }; console.log(getOnlyUniques([2, 3, 2]));

Comments

1

An alternative:

var a = [2,3,2], result = []; for(var i = 0; i < a.length; i++){ if(getAllIndexes(a, a[i]).length === 1) result.push(a[i]); } console.log(result); function getAllIndexes(arr, val) { var indexes = [], i = -1; while (~(i = arr.indexOf(val, i+1))) indexes.push(i); return indexes; } 

3 Comments

I can't tell what's going on here o.O Are you iterating over the array twice?
@Cerbrus Hey, I didn't say it's the best performing solution - just an alternative ;) Though it will be hard to yield < O(N^2) complexity.
O(n) is possible, though use of Sets. (could be done with objects too, but Sets are more appropriate)
1
const nums = [1,2,3,3,3,5,5,5]; const chars = ['a','b','a','b','a','a']; const mixed = [1,3,'b',3,'b','a','b',3]; const unique = [1,'a',3]; const distinct = (arr) => arr.filter((el) => arr.filter((item) => item === el).length === 1); console.log(distinct(nums)); // [ 1, 2 ] console.log(distinct(chars)); // [] console.log(distinct(mixed)); // [ 1, 'a' ] console.log(distinct(unique)); // [ 1, 'a', 3 ] 
  1. first, we'll double loop over "arr" with "filter"

arr.filter((el) => arr.filter((item) => ... );

  1. if "item" is equal to "el" then return its "length"

arr.filter((el) => arr.filter((item) => item === el).length

  • this will return the occurrence count for each element in the array
  • let' use the 1st example to illustrate this:
  • [1,2,3,3,3,5,5,5] --> [1,1,3,3,3,3,3,3]
  • 1 occurred 1 time
  • 2 occurred 1 time
  • 3 occurred 3 time
  • 5 occurred 3 time
  1. to return any element that is non-repeating or unique, we just need to specified length to equal "1"

arr.filter((el) => arr.filter((item) => item === el).length === 1)

  • this approach allows you to choose the amount of occurrences from an element you want to return
  • for instance, if you you want to return an element that occurs 3 times from an array, then set the "length" to equal 3

Comments

0

When it comes to removing duplicates from an array I usually use one approach:

const arrWithDuplicates = [1,2,2,2,3,4,4] const arrWithUniqueValues = [...new Set(arrWithDuplicates)] // result will be: [1,2,3,4] 

This also works with strings and booleans.

4 Comments

please give more clarity regarding what is Set
"The Set object lets you store unique values of any type, whether primitive values or object references." - MDN Docs.
So it gives you the possibility to store unique values by default.
the question is about extracting values which are unique, not removing duplicates of values
0

Another approach by taking a Map and set the value to false, if a key has been seen before. Then filter the array by taking the value of the map.

var array = [2, 3, 2], result = array.filter( Map.prototype.get, array.reduce((m, v) => m.set(v, !m.has(v)), new Map) ); console.log(result); // [3]

Comments

0

Just one line

arr.filter((item, pos, a) => a.lastIndexOf(item) === a.indexOf(item)); 

const arr = [1, 2, 3, 4, 1, 5, 6, 5]; const unique = arr.filter((item, pos, a) => a.lastIndexOf(item) === a.indexOf(item)); console.log(unique);

Util function

Array.prototype.unique = function() { return this.filter((item, pos, a) => a.lastIndexOf(item) === a.indexOf(item)); } console.log([1, 2, 3, 4, 1, 5, 6, 5].unique());

Comments

0

I used the trick below to do the magic

if(A.length > 1 && A.length < 100000) { const unique_element = []; A.map((elem, index, arr) => { for(let i = 0; i < arr.length; i++) { if(arr.lastIndexOf(elem) === arr.indexOf(elem)) { unique_element.push(elem); } } }) if(unique_element.length > 0) { alert(unique_element[0]); } else { alert("No unique value"); } } else { process.exit(1); } 

Comments

0
const getUnique = (nums) => { let res = 0; nums.forEach((element) => { res = res ^ element; }); return res; }; console.log(getUnique([1, 3, 1, 3, 4])); // returns 4 

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.