如何从数组中删除重复的数字?

Posted

技术标签:

【中文标题】如何从数组中删除重复的数字?【英文标题】:How to remove repeated number from an array? 【发布时间】:2022-01-10 13:59:18 【问题描述】:

如何彻底去除数组中的重复数字?

例如,如果:

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

输出应该是:

[3, 5]

【问题讨论】:

如果它是一个排序数组,它可以在 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);

【讨论】:

这是一个聪明的方法,它不需要显式地进行计数。【参考方案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 个集合或 2 个数组来做同样的事情。

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 article) 示例:

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 && 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 && 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]

注意:我从 link 获取 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]

【讨论】:

以上是关于如何从数组中删除重复的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Javascript 中的数组中删除重复项?

如何以最小的复杂性识别数组中的重复数字?

如何删除数组中的最后一个逗号和空格? Java [重复]

如何从数组中的数字中找到最大和最小数字[重复]

c语言如何判断一个数组中重复元素的个数,并输出这个个数的值?

如何从数组的numpy数组中删除外部数组[重复]