【问题标题】:How do I filter all items that occur once into one list and all items that occur multiple times into a different one?如何将所有出现一次的项目过滤到一个列表中,并将所有多次出现的项目过滤到另一个列表中?
【发布时间】:2023-03-27 09:43:01
【问题描述】:

我目前正在做一个项目,但我坚持要删除所有重复项。

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

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

【问题讨论】:

  • 您真的要删除或减少它们吗?例如:[1, 2, 2, 3, 3, 4, 5] 返回,[1, 2, 3, 4, 5]
  • 我想将它们单独删除到一个文件中。我希望它在 1 个文件中返回 [1,4,5] 并将 [2,2,3,3] 返回到另一个文件中。@AksJacoves
  • 数组会一直排序吗?
  • 不,但这可能需要考虑@Thomas

标签: javascript arrays duplicates


【解决方案1】:

For 循环数组并将每个值放入一个哈希映射中,该映射跟踪记录该数字的次数。然后循环遍历您的哈希映射并创建一个新数组,其中仅包含记录为 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;

}

【讨论】:

    【解决方案2】:

    不使用任何外部库 - 我相信有更简洁的方法可以做到这一点,但这应该可行:

    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]
    

    【讨论】:

      【解决方案3】:

      数组会一直排序吗?

      不,但这可能需要考虑@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);

      如果不能保证对数据进行排序,我们需要先进行计数,检查该数组中哪些项目是唯一的,哪些不是。在第二遍中,我们可以将它们添加到结果数组中。

      const array = [3, 2, 4, 2, 5, 1, 3];
      const single = [];
      const multiple = [];
      const count = {};
      
      for (let i = 0; i<array.length; ++i) {
        let value = array[i];
        count[value] = (count[value] || 0) + 1;
      }
      
      for (let i = 0; i<array.length; ++i) {
        let value = array[i];
        if (count[value] > 1) {
          multiple.push(value);
        } else {
          single.push(value);
        }
      }
      
      console.log("singles", single);
      console.log("multiple", multiple);

      【讨论】:

        【解决方案4】:

        基于您提供的输入:[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]]++;}
                else{map[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];
        
        }
        

        【讨论】:

          【解决方案5】:

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

          使用 Set()

          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]
          

          【讨论】:

          • 标题具有误导性。 OP实际上希望将所有出现一次的项目过滤到一个列表中,并将所有多次出现的项目过滤到另一个列表中。
          • @Thomas 抱歉,如果它具有误导性。但我不确定正确的措辞,因此我举了我的例子。谢谢你的帮助。更新问题
          猜你喜欢
          • 2012-05-15
          • 2015-06-04
          • 2014-03-05
          • 1970-01-01
          • 2019-06-13
          • 2018-09-21
          • 2023-03-12
          • 1970-01-01
          • 2017-09-28
          相关资源
          最近更新 更多