nonono
nonono

Reputation: 601

Return numbers which appear only once (JavaScript)

Say I have the array [1,2,3,5,2,1,4]. How do I get make JS return [3,4,5]?

I've looked at other questions here but they're all about delete the copies of a number which appears more than once, not both the original and the copies.

Thanks!

Upvotes: 3

Views: 4719

Answers (4)

Jul85
Jul85

Reputation: 1

I think there could exists option with Map.

function unique(array) {
  // code goes here
  const myMap = new Map();
  for (const el of array) {
    // save elements of array that came only once in the same order
    !myMap.has(el) ? myMap.set(el, 1) : myMap.delete(el);
  }
  return [...myMap.keys()];
}

const array = [1,2,3,5,2,1,4];
//[11, 23, 321, 300, 50, 23, 100,89,300];

console.log(unique(array));

Upvotes: 0

VJI
VJI

Reputation: 81

var arr = [1,2,3,5,2,1,4]
var sorted_arr = arr.slice().sort(); // You can define the comparing function here. 
var nonduplicates = [];
var duplicates=[];
for (var i = 0; i < arr.length; i++) {
    if (sorted_arr[i + 1] == sorted_arr[i]) {
        duplicates.push(sorted_arr[i]);
    }else{
        if(!duplicates.includes(sorted_arr[i])){
        nonduplicates.push(sorted_arr[i]);
      }
    }
}

alert("Non duplicate elements >>"+ nonduplicates);
alert("Duplicate elements >>"+duplicates);

Upvotes: 0

Pranav C Balan
Pranav C Balan

Reputation: 115232

Use Array#filter method twice.

var data = [1, 2, 3, 5, 2, 1, 4];

// iterate over elements and filter
var res = data.filter(function(v) {
  // get the count of the current element in array
  // and filter based on the count
  return data.filter(function(v1) {
    // compare with current element
    return v1 == v;
    // check length
  }).length == 1;
});

console.log(res);


Or another way using Array#indexOf and Array#lastIndexOf methods.

var data = [1, 2, 3, 5, 2, 1, 4];

// iterate over the array element and filter out
var res = data.filter(function(v) {
  // filter out only elements where both last 
  // index and first index are the same.
  return data.indexOf(v) == data.lastIndexOf(v);
});

console.log(res);

Upvotes: 7

Luka Krajnc
Luka Krajnc

Reputation: 915

You can also use .slice().sort()

var x = [1,2,3,5,2,1,4];
var y = x.slice().sort(); // the value of Y is sorted value X

var newArr = []; // define new Array

for(var i = 0; i<y.length; i++){ // Loop through array y
  if(y[i] != y[i+1]){ //check if value is single
    newArr.push(y[i]); // then push it to new Array
  }else{
    i++; // else skip to next value which is same as y[i]
  }
}


console.log(newArr);

If you check newArr it has value of:

[3, 4, 5]

Upvotes: 2

Related Questions