MapReduce删除重复的string

我有一个地图function,从电子邮件ID找出域名,并发出一个减lessfunction,计数域的数量。

[ { email:"xyz@gmail.com"}, { email:"abc@abc.com"}, { email:"inder@hotmail.com"}, { email:"Ravi@Hotmail.com"}, { email:"xxx@GMail.com"}, ] 

这是function

 db.collection.mapReduce( function() { emit(this.email.substr(this.email.indexOf('@') + 1), 1); }, function(host, count) { return Array.sum(count) ; }, { out: "hosts" } ) 

输出是好的: –

  gmail.com abc.com hotmail.com Hotmail.com GMail.com 

但是我想要的是

  gmail.com abc.com hotmail.com 

我不希望域名与<.com>之前的同名大写字母重复。 任何想法如何删除与大写字母重复。 或者任何相关的例子也不错。

有了ES5,你可以做这样的事情:

 var arr, res = []; arr = [ {email: "xyz@gmail.com"}, {email: "abc@abc.com"}, {email: "inder@hotmail.com"}, {email: "Ravi@Hotmail.com"}, {email: "xxx@GMail.com"} ]; arr.map(function (item) { return item.email.substr(item.email.indexOf('@') + 1).toLowerCase(); }).forEach(function (item) { if (res.indexOf(item) === -1) { res.push(item); } }); console.log(res); 

单线使用Set来获得唯一值:

 const arr = [ { email:"xyz@gmail.com"}, { email:"abc@abc.com"}, { email:"inder@hotmail.com"}, { email:"Ravi@Hotmail.com"}, { email:"xxx@GMail.com"}, ]; const r = [...new Set(arr.map(({email}) => email.toLowerCase().substr(email.indexOf('@') + 1)))] console.log(r) 

在emit函数中,您可以这样做,以便返回域的小写字母,如下所示: this.email.substr(this.email.indexOf('@') + 1).toLowerCase()

从所有GMail.com gmail.com GMAIL.COM等方式,你只会得到gmail.com