从数组Javascript中删除重复项

从数组Javascript中删除重复项,javascript,arrays,for-loop,Javascript,Arrays,For Loop,我正在寻找一种从数组中删除重复值的简单方法。我知道如何检测是否存在重复,只是我不知道如何从值中“推送”它。例如,如果您转到提供的链接,然后键入“abca”(在每个字母后按回车/回车键)。。它将提示“重复!” 但我也想弄清楚如何从文本区域中删除该副本 这部分似乎不起作用: sort = sort.push(i); textVal = sort; return textVal; 以下是我创建/用于删除重复项的函数: var removeDuplicatesInPlace = function (

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

但我也想弄清楚如何从文本区域中删除该副本

这部分似乎不起作用:

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

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

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 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);
}
功能移除副本(文本){
var-seen={};
var结果=“”;
对于(变量i=0;i
您可以使用删除重复项。您需要一个助手对象来跟踪一个项目被看到的次数

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()
步骤的输出可直接用于再次填充文本区域,而不会影响原始排序顺序


为什么这么做很难,使用专门用于此类操作的javascript筛选功能可以更轻松地完成:

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

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


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

基于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]

考虑:
结果+=seen中的字符?“”:seed[char]=char我认为,在2014年,EcmaScript 5时代已经过去五年,IE8在全球浏览器市场的份额还不到10%,我们可以放心地称之为正确答案。如果您关心对旧版本IE的支持,那么可以使用用于EC5的polyfill库。(我要指出的是,虽然“filter”在90%的情况下都是正确答案,但在其他地方可能存在对原始数组的引用的情况下,它本身并不合适,因为它创建了一个新数组,而原始数组对象保持不变。)所以,如果user2668376已经用这个解决方案回答了,为什么要重复它呢?顺便说一句,你有一个
self
太多了。他的解决方案没有.prototype。在我看来,使用它更好。我删除了var self=this;
Array.prototype.removeDuplicates = function () {
    return this.filter(function (item, index, self) {
        return self.indexOf(item) == index;
    });
};
[1, 3, 3, 7].removeDuplicates();