Как удалить повторяющееся число из массива?

#javascript #arrays #duplicates

#javascript #массивы #дубликаты

Вопрос:

Как полностью удалить повторяющиеся числа из массива?

Например, если:

 const array = [1, 1, 2, 3, 1, 2, 5]
 

Вывод должен быть:

 [3, 5]
 

Комментарии:

1. Если это отсортированный массив, это можно сделать в O (1) сложности пространства. Иначе вам нужно взять набор для проверки элементов

Ответ №1:

Вы можете использовать объект для отслеживания просмотренных элементов, взяв массив со значением или установив значение массива равным нулю.

Наконец, выровняйте результирующий набор, чтобы удалить пустые массивы.

 const
    array = [1, 1, 2, 3, 1, 2, 5],
    result = array
        .reduce((o => (r, v) => {
            if (v in o) o[v].length = 0;
            else r.push(o[v] = [v]);            
            return r;
        })({}), [])
        .flat();

console.log(result); 

Комментарии:

1. Это умный подход, для него не нужно выполнять подсчет явно.

Ответ №2:

Roko и Ke1vans ответили функциональными подходами. Оба они верны. Тем не менее, я бы показал ответ в императивном подходе, который может показаться более простым для новичка.

Аналогично их потоку. Сначала мы подсчитываем вхождение каждого числа. Затем мы выбираем числа, которые произошли один раз (следовательно, не повторяются), в выходной массив.

 let array = [1,1,2,3,1,2,5]
let counts = {}
let output = []

// loop each elements in the array as `item`
for(let item of array) {
  // If the item is not set in the counts, `counts[item]` will be `undefined`.
  // Using `|| 0` means use zero as fallback value if the items is unseen.
  let count = counts[item] || 0
  counts[item] = count   1
}

// loop each keys in the object (key-value pairs) as `item`
for(let item in counts) {
  let count = counts[item]
  if(count == 1) {
    // ` item` converts the key from string into number
    output.push( item)
  }
}

console.log(output) // will print out `[ 3, 5 ]`
 

Ответ №3:

Вы можете выполнять итерации и создавать карту значений. позже выполните итерацию и отфильтруйте.

 const data = [1, 1, 2, 3, 1, 2, 5];

const findUniques = (data = []) => {
  const map = data.reduce((m, num) => {
    m[num] = (m[num] || 0)   1;
    return m;
  }, {});
  return data.filter((num) => map[num] === 1);
};

console.log(findUniques(data)); 

Вы также можете сделать то же самое, используя 2 set или 2 array .

 const data = [1, 1, 2, 3, 1, 2, 5];
const findUniques2 = (data = []) => {
  let unique = new Set();
  let seen = new Set();
  for (let num of data) {
    if (seen.has(num)) unique.delete(num);
    else unique.add(num);
    seen.add(num);
  }
  return Array.from(unique);
};
console.log(findUniques2(data)); 

Ответ №4:

Используйте объект, где ключом является число, а значением — количество вхождений. Чем уменьшить его обратно до нужного массива значений:

 const arr = [1,1,2,3,1,2,5];

const res = Object.entries(arr.reduce((ob, v) => {
  if (!(v in ob)) ob[v] = 0;
  ob[v]  = 1;                       // Count occurrences
  return ob;
}, {})).reduce((arr, [k, v]) => {   // Reduce back to Array
  if (v === 1) arr.push( k);        // Only keys with 1 occurrence
  return arr;
}, []);

console.log(res);                   // [3, 5] 

Ответ №5:

Вы можете использовать Array.filter() (статья Array filter) для этого
, например :

 const a = [ 1 , 1 , 2 , 3 , 2 , 4 , 5 , 7];

function filter(value , index , array){

    // looping through all the objects in the array
    for(let i=0; i<array.length; i  ) {
        if(i != index amp;amp; array[i] == value) return false; // return 'false' if the value has a duplicate other than itself
    }
    // return 'TRUE' if value hasn't been duplicated
    return true;

}

const b = a.filter(filter); // [3, 4, 5, 7]
 

И короткая версия, если эта функция будет использоваться только один раз:

 const a = [ 1 , 1 , 2 , 3 , 2 , 4 , 5 , 7];

const b = a.filter((value , index , array) => {
    for(let i=0; i<array.length; i  ) if(i != index amp;amp; array[i] == value) return false;
    return true;
}); 

// [3, 4, 5, 7]
 

Ответ №6:

Вы могли бы найти дубликаты, а затем обработать разницу.

 let a = [1,1,2,3,1,2,5];
const findDuplicates = (nums) => {
    nums.sort(); // alters original array
    let ans = []
  
    for(let i = 0; i< nums.length; i  ){
      if(nums[i] === nums[i 1]){
         if(ans[ans.length -1] !== nums[i]){
            ans.push(nums[i])
         }
      } 
    }
    return ans;
  }
duplicates = new Set(findDuplicates(a))
let difference = new Set([...a].filter(x => !duplicates.has(x)))
console.log(Array.from(difference))
 

вывод: [ 3, 5]

Примечание: я беру функцию findDuplicates по этой ссылке

Ответ №7:

 const data = [1, 1, 2, 3, 1, 2, 5];

const s = new Set();

const res = data.filter((a, i) => {
    if (data.lastIndexOf(a) > i || s.has(a)) {
        s.add(a);
        return false;
    }
    return true;
});

console.log(res); //=> [3, 5]