从JS数组中移除重复值

2348

我有一个非常简单的JavaScript数组,可能包含重复项。

var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];

我需要删除重复项并将唯一值放入一个新数组。

我可以指出我尝试过的所有代码,但我认为这没有用,因为它们不起作用。我接受jQuery解决方案。

类似问题:


95
_.uniq(peoplenames) 解决了这个问题。请参考 http://lodash.com/docs#uniq 了解更多信息。 - Connor Leech
10
@ConnorLeech 使用 lodash 很容易,但这不是最优化的方式。 - Suhail Mumtaz Awan
45
我认为最简单的方法是使用Set对象,它可以存储任何类型的唯一值。换句话说,Set会自动帮我们删除重复的元素。`const names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];let unique = [...new Set(names)]; console.log(unique); // 'Mike', 'Matt', 'Nancy', 'Adam', 'Jenny', 'Carl'` - Asif vora
13
世界上有太多叫Mike的人了——为什么不把他们移除掉呢?Nancy在这件事上被打败了。 - toad
3
在我的解决方案中,我会在过滤之前对数据进行排序:const result = data.sort().filter((v, idx, t) => idx==0 || v != t[idx-1]); - Didier68
显示剩余10条评论
54个回答

1
这里是另一种使用jQuery的方法,
function uniqueArray(array){
  if ($.isArray(array)){
    var dupes = {}; var len, i;
    for (i=0,len=array.length;i<len;i++){
      var test = array[i].toString();
      if (dupes[test]) { array.splice(i,1); len--; i--; } else { dupes[test] = true; }
    }
  } 
  else {
    if (window.console) console.log('Not passing an array to uniqueArray, returning whatever you sent it - not filtered!');
      return(array);
  }
  return(array);
}

作者: William Skidmore


1
function removeDuplicates(inputArray) {
            var outputArray=new Array();

            if(inputArray.length>0){
                jQuery.each(inputArray, function(index, value) {
                    if(jQuery.inArray(value, outputArray) == -1){
                        outputArray.push(value);
                    }
                });
            }           
            return outputArray;
        }

1
最简单的去除字符串重复的方法是使用关联数组,然后遍历关联数组以将列表/数组还原。

就像下面这样:

var toHash = [];
var toList = [];

// add from ur data list to hash
$(data.pointsToList).each(function(index, Element) {
    toHash[Element.nameTo]= Element.nameTo;
});

// now convert hash to array
// don't forget the "hasownproperty" else u will get random results 
for (var key in toHash)  {
    if (toHash.hasOwnProperty(key)) { 
      toList.push(toHash[key]);
   }
}

Voila,现在重复的内容已经消失了!

0
var duplicates = function(arr){
     var sorted = arr.sort();
   var dup = [];
   for(var i=0; i<sorted.length; i++){
        var rest  = sorted.slice(i+1); //slice the rest of array
       if(rest.indexOf(sorted[i]) > -1){//do indexOf
            if(dup.indexOf(sorted[i]) == -1)    
         dup.push(sorted[i]);//store it in another arr
      }
   }
   console.log(dup);
}

duplicates(["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"]);

0

这个解决方案使用了一个新的数组和函数内部的对象映射。它所做的就是循环遍历原始数组,并将每个整数添加到对象映射中。如果在遍历原始数组时遇到重复项,

`if (!unique[int])`

这是因为对象上已经有一个与该数字相同的键属性,所以它会被捕获。因此,跳过该数字并不允许将其推入新数组。

    function removeRepeats(ints) {
      var unique = {}
      var newInts = []

      for (var i = 0; i < ints.length; i++) {
        var int = ints[i]

        if (!unique[int]) {
          unique[int] = 1
          newInts.push(int)
        }
      }
      return newInts
    }

    var example = [100, 100, 100, 100, 500]
    console.log(removeRepeats(example)) // prints [100, 500]

0

使用Lodash快速简单 - var array = ["12346","12347","12348","12349","12349"]; console.log(_.uniqWith(array,_.isEqual));


0
如果您正在创建数组,可以在插入数据时进行检查,从而节省循环和额外的唯一过滤器。
var values = [];
$.each(collection, function() {
    var x = $(this).value;
    if (!$.inArray(x, values)) {
        values.push(x);
    }
});

使用jQuery inArray方法时要小心:它返回的是数组中元素的索引,而不是布尔值。请查看文档:jQuery.inArray() - xonya

0

如果您不想包含整个库,可以使用这个方法来添加一个任何数组都可以使用的方法:

Array.prototype.uniq = function uniq() {
  return this.reduce(function(accum, cur) { 
    if (accum.indexOf(cur) === -1) accum.push(cur); 
    return accum; 
  }, [] );
}

["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"].uniq()

0

使用复杂度为O(n)的Vanilla JS解决方案(对于此问题来说是最快的)。如果需要,修改hashFunction以区分对象(例如1和“1”)。第一个解决方案避免了隐藏循环(在Array提供的函数中常见)。

var dedupe = function(a) 
{
    var hash={},ret=[];
    var hashFunction = function(v) { return ""+v; };
    var collect = function(h)
    {
        if(hash.hasOwnProperty(hashFunction(h)) == false) // O(1)
        {
            hash[hashFunction(h)]=1;
            ret.push(h); // should be O(1) for Arrays
            return;
        }
    };

    for(var i=0; i<a.length; i++) // this is a loop: O(n)
        collect(a[i]);
    //OR: a.forEach(collect); // this is a loop: O(n)

    return ret;
}

var dedupe = function(a) 
{
    var hash={};
    var isdupe = function(h)
    {
        if(hash.hasOwnProperty(h) == false) // O(1)
        {
            hash[h]=1;
            return true;
        }

        return false;
    };

    return a.filter(isdupe); // this is a loop: O(n)
}

0
var lines = ["Mike", "Matt", "Nancy", "Adam", "Jenny", "Nancy", "Carl"];
var uniqueNames = [];

for(var i = 0; i < lines.length; i++)
{
    if(uniqueNames.indexOf(lines[i]) == -1)
        uniqueNames.push(lines[i]);
}
if(uniqueNames.indexOf(uniqueNames[uniqueNames.length-1])!= -1)
    uniqueNames.pop();
for(var i = 0; i < uniqueNames.length; i++)
{
    document.write(uniqueNames[i]);
      document.write("<br/>");
}

你的代码运行得很好。但是代码“uniqueNames.pop()”无缘无故地删除了最后一个数组元素。它使得“Carl”未被列在数组中。 - Santosh
1
@Santosh 对的,由于StackOverflow上有太多待处理的编辑,我现在无法编辑这个。但如果有人在任何时间点能够编辑,请将uniqueNames.pop()这行删除。 - undefined

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