2

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!

nonono
  • 591
  • 2
  • 8
  • 14

4 Answers4

6

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);
Pranav C Balan
  • 113,687
  • 23
  • 165
  • 188
2

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]
Luka Krajnc
  • 915
  • 1
  • 7
  • 21
0
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);
VJI
  • 81
  • 3
0

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));
Jul85
  • 1
  • 1