【问题标题】:Remove duplicate item from array Javascript [duplicate]从数组Javascript中删除重复项[重复]
【发布时间】:2013-08-03 04:48:55
【问题描述】:

我正在寻找一种从数组中删除重复值的简单方法。我想出了如何检测是否有重复,只是我不知道如何从值中“推送”它。例如,如果您转到提供的链接,然后输入“abca”(每个字母后按回车键)..它会提示“重复! "

但我也想弄清楚如何从 textarea 中删除该重复项?

http://jsfiddle.net/P3gpp/

这是似乎不起作用的部分::

sort = sort.push(i);
textVal = sort;
return textVal;

【问题讨论】:

    标签: javascript arrays for-loop


    【解决方案1】:

    为什么要这么难,使用专门针对此类操作的javascript过滤功能可以更轻松地完成:

    var arr = ["apple", "bannana", "orange", "apple", "orange"];
    
    arr = arr.filter( function( item, index, inputArray ) {
               return inputArray.indexOf(item) == index;
        });
    
    
    ---------------------
    Output: ["apple", "bannana", "orange"]
    

    【讨论】:

    • 我认为,在 2014 年,即 EcmaScript 5 时代已经过去五年,IE8 占全球浏览器份额低于 10%,我们可以放心地将其称为正确答案。如果担心对旧版本 IE 的支持,可以使用 EC5 的 polyfill 库。
    • (我会注意到,虽然“过滤器”在 90% 的情况下都是正确答案,但在其他地方可能引用原始数组的情况下,它本身并不合适,因为它创建一个新数组,原始数组对象保持不变。)
    【解决方案2】:

    基于user2668376解决方案,这将返回一个没有重复的新数组。

    Array.prototype.removeDuplicates = function () {
        return this.filter(function (item, index, self) {
            return self.indexOf(item) == index;
        });
    };
    

    之后你可以这样做:

    [1, 3, 3, 7].removeDuplicates();
    

    结果将是; [1, 3, 7].

    【讨论】:

    • 那么,如果 user2668376 已经回答了这个解决方案,为什么还要重复呢?顺便说一句,你的self 太多了。
    • 他的解决方案是没有 .prototype。在我看来,使用它要好得多。我删除了 var self = this;
    【解决方案3】:

    这些是我创建/用于删除重复项的函数:

    var removeDuplicatesInPlace = function (arr) {
        var i, j, cur, found;
        for (i = arr.length - 1; i >= 0; i--) {
            cur = arr[i];
            found = false;
            for (j = i - 1; !found && j >= 0; j--) {
                if (cur === arr[j]) {
                    if (i !== j) {
                        arr.splice(i, 1);
                    }
                    found = true;
                }
            }
        }
        return arr;
    };
    
    var removeDuplicatesGetCopy = function (arr) {
        var ret, len, i, j, cur, found;
        ret = [];
        len = arr.length;
        for (i = 0; i < len; i++) {
            cur = arr[i];
            found = false;
            for (j = 0; !found && (j < len); j++) {
                if (cur === arr[j]) {
                    if (i === j) {
                        ret.push(cur);
                    }
                    found = true;
                }
            }
        }
        return ret;
    };
    

    所以使用第一个,这就是您的代码的外观:

    function cleanUp() {
        var text = document.getElementById("fld"),
            textVal = text.value,
            array;
    
        textVal = textVal.replace(/\r/g, " ");
        array = textVal.split(/\n/g);
    
        text.value = removeDuplicatesInPlace(array).join("\n");
    }
    

    演示: http://jsfiddle.net/VrcN6/1/

    【讨论】:

      【解决方案4】:

      您可以使用Array.reduce() 删除重复项。您需要一个辅助对象来跟踪某个项目已被查看的次数。

      function cleanUp() 
      {
          var textBox = document.getElementById("fld"),
          array = textBox.value.split(/\r?\n/g),
          o = {},
          output;
      
          output = array.reduce(function(prev, current) {
              var key = '$' + current;
      
              // have we seen this value before?
              if (o[key] === void 0) {
                  prev.push(current);
                  o[key] = true;
              }
      
              return prev;
          }, []);
      
          // write back the result
          textBox.value = output.join("\n");
      }
      

      reduce() 步骤的输出可直接用于再次填充文本区域,而不影响原来的排序顺序。

      Demo

      【讨论】:

        【解决方案5】:

        您只需一个对象即可轻松完成此操作:

        function removeDuplicates(text) {
            var seen = {};
            var result = '';
        
            for (var i = 0; i < text.length; i++) {
                var char = text.charAt(i);
        
                if (char in seen) {
                    continue;
                } else {
                    seen[char] = true;
                    result += char;
                }
            }
        
            return result;
        }
        
        function cleanUp() {
            var elem = document.getElementById("fld");
        
            elem.value = removeDuplicates(elem.value);
        }
        

        【讨论】:

        • 考虑:result += char in seen? '' : seen[char] = char;
        【解决方案6】:
        arr3 = [1, 2, 3, 2, 4, 5];
        unique = [];
        
        function findUnique(val)
        {
          status = '0';  
          unique.forEach(function(itm){
            if(itm==val){ 
              status=1;
            }
          })
          return status;
        }
        
        arr3.forEach(function(itm){
          rtn =  findUnique(itm);
          if(rtn==0)
            unique.push(itm);
        });
        
        console.log(unique);  // [1, 2, 3, 4, 5]
        

        【讨论】:

          猜你喜欢
          • 2011-12-02
          • 2012-10-04
          • 2012-12-06
          • 1970-01-01
          • 2011-06-29
          • 2023-02-21
          • 2021-07-20
          • 2020-12-28
          相关资源
          最近更新 更多