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解构为数组
我有一个映射函数,它可以从电子邮件 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解构为数组