从数组中删除重复元素

3

你尝试过什么?虽然没有本地可用的函数,但自己编写并不难。 - Halcyon
这个问题已经被问过了。https://dev59.com/U3E95IYBdhLWcg3wp_kg 那里的解决方案非常聪明和好。 - Prasanna
我尝试使用以下代码:for (var i = 0; i < output.length - 1; i++) { if (sorted_arr[i + 1] == sorted_arr[i]) { results.push(sorted_arr[i]); } } - vishnu
4个回答

9
你可以编写这样的函数
function eliminateDuplicates(arr) {
var i,
  len=arr.length,
  out=[],
  obj={};

 for (i=0;i<len;i++) {
 obj[arr[i]]=0;
 }
 for (i in obj) {
 out.push(i);
 }
 return out;
}`

Check this here


3
也许比你需要的更复杂,但是:
function array_unique (inputArr) {
    // Removes duplicate values from array  
    var key = '',
        tmp_arr2 = {},
        val = '';

    var __array_search = function (needle, haystack) {
        var fkey = '';
        for (fkey in haystack) {
            if (haystack.hasOwnProperty(fkey)) {
                if ((haystack[fkey] + '') === (needle + '')) {
                    return fkey;
                }
            }
        }
        return false;
    };

    for (key in inputArr) {
        if (inputArr.hasOwnProperty(key)) {
            val = inputArr[key];
            if (false === __array_search(val, tmp_arr2)) {
                tmp_arr2[key] = val;
            }
        }
    }

    return tmp_arr2;
}

代码取自:http://phpjs.org/functions/array_unique:346

1
你不觉得这对于提问者来说可能有点过于复杂了吗?他显然刚开始学习JavaScript。不过,他也可以只是复制粘贴并让魔术函数发挥作用,但那并不是很有帮助或符合良好学习的精神... - Elliot Bonneville
如果你刚刚开始学习编程,这是一件比较复杂的事情。我曾经以为他只需要一个复制粘贴的解决方案。 - nathanjosiah

1
首先,您需要使用数组字面量(var output = [])来声明数组。其次,您需要循环遍历数组并将所有值存储在第二个数组中。如果第一个数组中的任何值与第二个数组中的值匹配,则删除它并继续循环。
您的代码应该像这样:
var output = [
    "Rose",
    "India",
    "Technologies",
    "Rose",
    "Ltd",
    "India",
    "Rose"
]

var doubledOutput = [];

for(var i = 0; i < output.length; i++) {
    var valueIsInArray = false;

    for(var j = 0; j < doubledOutput.length; j++) {
        if(doubledOutput[j] == output[i]) {
            valueIsInArray = true;
        }
    }

    if(valueIsInArray) {
        output.splice(i--, 1);
    } else {
        doubledOutput.push(output[i]);
    }
}

请注意,上述代码未经测试,可能包含错误。

我可以问一下未解释的负投票原因吗?对于显然不需要复杂和过度工作的Javascript初学者来说,这只是一种简单、易读和易于查找重复值的方法。 - Elliot Bonneville
我没有给你的内容投反对票,但是你们两个都在增加 i 的值并且删除项目,这样你们将会错过一些元素,除非你们在拼接一个元素时也将 i 的值减小。 - pimvdb
哎呀,是的,我应该使用一个反向循环。我的错,谢谢你指出来。 - Elliot Bonneville
事实上,我认为你的意思是将 valueIsInArray 更改为 true 并实际填充 doubledOutput... - pimvdb
你知道吗,下次我会先测试我的代码。 - Elliot Bonneville
显示剩余4条评论

1

您可以使用临时哈希表(使用JavaScript对象)来删除数组中的重复项,以跟踪您已经在数组中看到的图像。这适用于可以唯一表示为字符串的数组值(主要是字符串或数字),但不适用于对象。

function removeDups(array) {
    var index = {};
    // traverse array from end to start 
    // so removing the current item from the array
    // doesn't mess up the traversal
    for (var i = array.length - 1; i >= 0; i--) {
        if (array[i] in index) {
            // remove this item
            array.splice(i, 1);
        } else {
            // add this value to index
            index[array[i]] = true;
        }
    }
}

这是一个可工作的示例:http://jsfiddle.net/jfriend00/sVT7g/ 对于大型数组,使用对象作为临时索引将比线性搜索数组快多倍。

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