我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?相关的知识,希望对你有一定的参考价值。

我目前正在从事一个项目,但是我坚持删除所有重复项。

我需要删除所有重复的名称并放入单独的文件中

这是我正在尝试实现的示例:所以我有一个数字数组(1,2,2,3,3,4,5),我想从数组中删除所有重复项,以得到(1,4,5)。

答案

用于循环数组,并将每个值放入哈希映射,该映射跟踪记录该数字的次数。然后循环遍历您的哈希映射,并创建一个仅包含记录为1的值的新数组。

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

function removeDuplicates(arr) 

    var hashMap = ;
    for(let i of arr) 
        if(hashMap[i])
            hashMap[i] += 1
         else 
            hashMap[i] = 1
        
    

    var newArray = [];
    for(let [key, value] of Object.entries(hashMap))
        if(value === 1) 
            newArray.push(parseInt(key));
         else 
            // If you want to do something with values recorded more
            // than once, you can do that here.
        
    

    return newArray;


另一答案

无需使用任何外部库-我敢肯定还有更多简洁的方法可以做到这一点,但这应该可行:

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

function removeDuplicates(array) 

  var existingValues = [];   // Holds all values that exist at least once
  var duplicates = [];       // Holds all values that are duplicates

  array.forEach(function(num) 
    if (existingValues.indexOf(num) === -1) 
      existingValues.push(num);
     else 
      duplicates.push(num);
    
  );

  // Filter out the values from existingValues that are in the duplicates array
  return existingValues.filter(function(i) 
    return duplicates.indexOf(i) === -1;
  );



console.log(removeDuplicates(numbers)); // [1,4,5]
另一答案

将始终对数组进行排序吗?

否,但是可能要考虑@Thomas

好的,这应该允许这样的事情:

仅查看邻居即可确定一个值是单个值还是具有多个出现次数。

const array = [1,2,2,3,3,4,5];
const single = [];
const multiple = [];

for (let i = 0, length = array.length; i < length; ++i) 
  let value = array[i];
  const isDupe = i > 0 && value === array[i - 1]
    || i + 1 < length && value === array[i + 1];

  if (isDupe) 
    multiple.push(value);
   else 
    single.push(value);
  


console.log("singles", single);
console.log("multiple", multiple);
另一答案

有很多方法可以删除数组中的重复项。这是一些示例。

使用Set()

Set对象是值的集合。您可以遍历一组按插入顺序排列的元素。集合中的值只能发生一次

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const duplicated = [1,2,3,2,3,4,3,5];
const uniqSet = new Set(duplicated);
console.log([...uniqSet]) // Should be [1, 2, 3, 4, 5]

使用lodash uniq()方法

文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const _ = require('lodash');

const duplicated = [1,2,3,2,3,4,3,5];
const uniq = _.uniq(duplicated);
console.log(uniq) // Should be [1, 2, 3, 4, 5]

从头开始

const duplicated = [1,2,3,2,3,4,3,5];
const uniq = [];

for (const e of duplicated) 
  if (!uniq.includes(e)) 
    uniq.push(e)
  


console.log(uniq) // Should be [1,2,3,4,5]
另一答案

根据您提供的输入:[1、2、2、3、3、4、5]和您说的事实,您需要两个输出:一个具有唯一值[1,4,5],另一个重复项[2,2,3,3]。

下面的函数将为您提供两个数组作为输出,一个具有唯一值,另一个具有重复值。

const getUniqueAndDuplicates =(arr)=>

//use a javascript object as a map to count frequency
const map=;
for(let i=0;i<arr.length;i++)
    if(map[arr[i]])map[arr[i]]++;
    elsemap[arr[i]]=1;


const uniqueArray=[];
const duplicateArray=[];



for(let key in map)
    //get the frequency count
    let freq=map[key];

    if(freq===1)uniqueArray.push(key);
    else
        for(let i=0;i<freq;i++)
            duplicateArray.push(key);
        
    



return [uniqueArray,duplicateArray];

以上是关于我如何将一次出现的所有项目过滤到一个列表中,并将多次出现的所有项目过滤到另一个列表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Angular 2中选择ngFor中的所有过滤复选框?

删除所有项目的类并将类添加到 Vue.js 中的单击项目

SQL - 如何过滤关键字不正常的结果并将它们放在底部?

如何从核心数据中的实体中获取所有项目的列表,每个项目只出现一次?

过滤后ListView不更新

Python:按索引过滤列表