在Javascript中删除数组中的重复元素

7

我有一个包含email和ID对象的数组,因此我想删除具有相似ID的重复元素。

例如:

var newarray=[
    {
        Email:"test1@gmail.com",
        ID:"A"
    },
    {
        Email:"test2@gmail.com",
        ID:"B"
    },
    {
        Email:"test3@gmail.com",
        ID:"A"
    },
    {
        Email:"test4@gmail.com",
        ID:"C"
    },
    {
        Email:"test4@gmail.com",
        ID:"C"
    }
];

现在我需要删除具有相同ID的重复元素。我的期望结果是最终数组如下:

var FinalArray=[
    {
        Email:"test1@gmail.com",
        ID:"A"
    },
    {
        Email:"test2@gmail.com",
        ID:"B"
    },  
    {
        Email:"test5@gmail.com",
        ID:"C"
    }
];

你所需要做的就是创建一个新数组,遍历原始数组并将不重复的项填充到新数组中。当然,你可以通过使用对象或 Map 或其他方式来提高性能,但思路是相同的。 - Yeldar Kurmangaliyev
你期望 ID:"A" 的结果是 test1,但是却得到了 ID:"C" 的结果 test5。这是否意味着你不关心被过滤掉的重复项是哪一个? - pawel
为什么是'test5@gmail.com'而不是'test4@gmail.com' - Nina Scholz
感谢大家的快速回答。 - Santosh Khavekar
为什么标记为重复????有人能从链接的问题中找到任何解决此问题的代码吗?? - tsh
以下是一种实现方法:https://dev59.com/q2Up5IYBdhLWcg3wrY5p#58429784 - Arun Saini
4个回答

6
使用 Array.prototype.filter 进行元素过滤,并使用一个 temp 数组来检查重复元素。

var newarray = [{
  Email: "test1@gmail.com",
  ID: "A"
}, {
  Email: "test2@gmail.com",
  ID: "B"
}, {
  Email: "test3@gmail.com",
  ID: "A"
}, {
  Email: "test4@gmail.com",
  ID: "C"
}, {
  Email: "test5@gmail.com",
  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);


4
你可以使用哈希表来过滤它。

var newarray = [{ Email: "test1@gmail.com", ID: "A" }, { Email: "test2@gmail.com", ID: "B" }, { Email: "test3@gmail.com", ID: "A" }, { Email: "test4@gmail.com", ID: "C" }, { Email: "test5@gmail.com", ID: "C" }],
    filtered = newarray.filter(function (a) {
        if (!this[a.ID]) {
            this[a.ID] = true;
            return true;
        }
    }, Object.create(null));

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

使用Set进行ES6编程

var newarray = [{ Email: "test1@gmail.com", ID: "A" }, { Email: "test2@gmail.com", ID: "B" }, { Email: "test3@gmail.com", ID: "A" }, { Email: "test4@gmail.com", ID: "C" }, { Email: "test5@gmail.com", ID: "C" }],
    filtered = newarray.filter((s => a => !s.has(a.ID) && s.add(a.ID))(new Set));

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


很棒的ES6 Set解决方案! - Khalid T.

2

如果你可以使用Javascript库,比如underscore或者lodash,我建议你去看一下它们的库中的_.uniq函数。以下是lodash库中的描述:

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

在这里你需要像下面这样使用:

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

1

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

var newarray=[ { Email:"test1@gmail.com", ID:"A" }, { Email:"test2@gmail.com", ID:"B" }, { Email:"test3@gmail.com", ID:"A" }, { Email:"test4@gmail.com", ID:"C" }, { Email:"test5@gmail.com", 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);
.as-console-wrapper{top:0;max-height:100%!important;}


@SantoshKhavekar请告诉我(并投票支持!)这个答案是否帮助了您,谢谢! - kukkuz

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