从Javascript数组中删除重复项

17

我正在寻找一种简单的方法从数组中删除重复值。我已经想出如何检测是否存在重复项,但我不知道如何从值中“推”它。例如,如果你点击提供的链接,然后输入“abca”(每个字母后按回车/输入键).. 它会弹出“重复!”

但我也想弄清楚如何从文本区域中删除该重复项?

http://jsfiddle.net/P3gpp/

这似乎是没有起作用的部分:

sort = sort.push(i);
textVal = sort;
return textVal;
6个回答

69

为什么要走弯路,可以使用专门针对这种操作的 JavaScript 过滤器函数更轻松地完成:

var arr = ["apple", "bannana", "orange", "apple", "orange"];

arr = arr.filter( function( item, index, inputArray ) {
           return inputArray.indexOf(item) == index;
    });


---------------------
Output: ["apple", "bannana", "orange"]

4
我认为,在2014年,进入EcmaScript 5时代五年后,并且IE8以下的全球浏览器份额不到10%,我们可以安全地称其为正确答案。如果您关心对旧版IE的支持,则可以使用EC5的polyfill库。 - Semicolon
2
我要指出的是,虽然“filter”在90%的情况下是正确的答案,但在存在对原始数组引用的情况下,仅使用“filter”是不恰当的,因为它会创建一个新数组,而原始数组对象则保持不变。 - Semicolon

6

基于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 - Bergi
1
他的解决方案没有使用 .prototype。在我看来,最好使用它。我删除了 var self = this; - Frank Roth

4

这些是我创建/使用的用于去重的函数:

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");
}

DEMO: http://jsfiddle.net/VrcN6/1/


2
您可以使用 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

1
你可以很容易地用一个对象来实现这个:

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; - RobG

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接