在Javascript中从Array中删除重复的元素

Delete duplicate elements from Array in Javascript

本问题已经有最佳答案,请猛点这里访问。

我有一个带有obejcts电子邮件和id的数组,所以我想删除具有类似id的重复元素。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var newarray=[
    {
        Email:"[email protected]",
        ID:"A"
    },
    {
        Email:"[email protected]",
        ID:"B"
    },
    {
        Email:"[email protected]",
        ID:"A"
    },
    {
        Email:"[email protected]",
        ID:"C"
    },
    {
        Email:"[email protected]",
        ID:"C"
    }
];

现在我需要删除重复的元素,这些元素的ID是常见的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var FinalArray=[
    {
        Email:"[email protected]",
        ID:"A"
    },
    {
        Email:"[email protected]",
        ID:"B"
    },  
    {
        Email:"[email protected]",
        ID:"C"
    }
];


使用array.prototype.filter过滤元素并检查重复项使用temp数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var newarray = [{
  Email:"[email protected]",
  ID:"A"
}, {
  Email:"[email protected]",
  ID:"B"
}, {
  Email:"[email protected]",
  ID:"A"
}, {
  Email:"[email protected]",
  ID:"C"
}, {
  Email:"[email protected]",
  ID:"C"
}];
   
// Array to keep track of duplicates
var dups = [];
var arr = newarray.filter(function(el) {
  // If it is not a duplicate, return true
  if (dups.indexOf(el.ID) == -1) {
    dups.push(el.ID);
    return true;
  }

  return false;
 
});

console.log(arr);


你可以用哈希表过滤它。

1
2
3
4
5
6
7
8
9
var newarray = [{ Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"B" }, { Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"C" }, { Email:"[email protected]", ID:"C" }],
    filtered = newarray.filter(function (a) {
        if (!this[a.ID]) {
            this[a.ID] = true;
            return true;
        }
    }, Object.create(null));

console.log(filtered);
1
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6与Set一起

1
2
3
4
var newarray = [{ Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"B" }, { Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"C" }, { Email:"[email protected]", ID:"C" }],
    filtered = newarray.filter((s => a => !s.has(a.ID) && s.add(a.ID))(new Set));

console.log(filtered);
1
.as-console-wrapper { max-height: 100% !important; top: 0; }


如果您可以使用诸如下划线或lodash之类的javascript库,我建议您查看它们库中的.uniq函数。来自Loase:

1
_.uniq(array, [isSorted=false], [callback=_.identity], [thisArg])

这里你必须像下面那样使用,

1
var non_duplidated_data = _.uniq(newarray, 'ID');

另一种使用Array.prototype.reduce和哈希表的解决方案-见下面的演示:

1
2
3
4
5
6
7
8
9
10
var newarray=[ { Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"B" }, { Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"C" }, { Email:"[email protected]", ID:"C" } ];

var result = newarray.reduce(function(hash){
  return function(prev,curr){
     !hash[curr.ID] && (hash[curr.ID]=prev.push(curr));
     return prev;
  };
}(Object.create(null)),[]);

console.log(result);
1
.as-console-wrapper{top:0;max-height:100%!important;}