MapReduce 删除重复的字符串

MapReduce to removing duplicates of string

我有一个映射函数,它可以从电子邮件 ID 中找出域名,并发出该函数以减少计算域数的函数。

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

这是函数

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> 之前有包含大写字母的重复域名和相同名称。关于如何使用大写字母删除重复项的任何想法。或者任何相关的例子也很好。

在 emit 函数中,您可以像这样 return 域的小写字母:this.email.substr(this.email.indexOf('@') + 1).toLowerCase() Info here

这样从所有 GMail.com gmail.com GMAIL.COM 等等,你只会得到 gmail.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)

此代码使用解构语法获取数组中每个对象的 email 属性,然后将其变为小写并截断域名,并使用 Set 使结果数组唯一构造器,将这个Set解构为数组