【发布时间】:2020-06-15 04:52:47
【问题描述】:
我会解释需要什么。希望您能提供帮助。 我有一个数组。首先,两个数字是无关紧要的权重,然后是空格和一个电子邮件。
var arr= new Array("10 firstemail@email.com","15 secondemail@email.com","25 secondemail@email.com","35 secondemail@email.com","15 firstemail@email.com"); // huge array with many emails not just 2
我想要一个新数组,按电子邮件过滤,重复次数最少。
应该是:
["10 firstemail@email.com","15 firstemail@email.com"];
因为 firstemail@email.com 只重复 2 次,而 secondemail@email.com 重复 3 次。
使用的浏览器是带有 jQuery 的 IE8(必须使用 jQuery,因为原生 .filter() 不起作用)
我知道这可能可以通过几个 foreach/fors 来完成,但我正在寻找优化的解决方案。
例如:
new_arr = $(arr).filter(function (str) { return arr[str].indexOf("firstemail@email.com") >=0; });
如果您知道 firstemail@email.com 在数组中重复次数最少,则此方法有效,但这不是解决方案,因为我不知道哪个电子邮件重复次数最少.. 可能 Math.min 可以以某种方式使用,但我会很高兴得到帮助。
编辑:请看一下这段代码
var arr= new Array("10 firstemail@email.com","15 secondemail@email.com","25 secondemail@email.com","35 secondemail@email.com","15 firstemail@email.com"); // huge array with many emails not just 2
function extractEmails (text) { return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi); } // Please edit the regEx to get least repeated email instead all
var get_least_repeated=extractEmails(arr.toString());
new_arr = $(arr).filter(function (str) { return arr[str].indexOf(get_least_repeated) >=0; });
console.log(new_arr);
这似乎效果最好,但我根本不擅长 regEx 来更改 extractEmails 函数以获取最少重复的电子邮件(目前得到所有)
另一个想法是以某种方式使用 jQuery.grep()。
编辑 2:我想出了我自己的优化代码,以 @arielb 的想法将电子邮件作为键和重复计数作为值的对象。
最终代码
var arr = new Array(
"15 secondemail@email.com",
"10 firstemail@email.com",
"25 secondemail@email.com",
"35 secondemail@email.com",
"15 firstemail@email.com",
"12 third@email.com",
"35 secondemail@email.com"
); // huge array with many emails nut just 2
var new_emails={}; //init an object
$.each(arr,function(k,v){
var justmail=v.split(" ")[1];
if(typeof(new_emails[justmail])=='undefined') new_emails[justmail]=0;
new_emails[justmail]+=1;
});
var selectedemail=''; var eminvalue=Number.MAX_VALUE;
$.each(new_emails,function(k,v){
if(v<eminvalue) {eminvalue=v;selectedemail=k;}
});
var new_arr=$(arr).filter(function (str) { return arr[str].indexOf(selectedemail) >=0; });
console.log(new_arr);
【问题讨论】:
-
不使用正则表达式来匹配电子邮件(已知有问题),为什么不匹配字符串开头的一些数字和一些空格(更容易匹配
^\d+\s+)?您也可以只使用map:arr = arr.map(text => text.replace(/^\d+\s+/, '')),这将为您提供一系列电子邮件。然后,我将使用reduce来完成其余部分。 -
@HereticMonkey 关于正则表达式的好点。这只是一个例子。问题是我相信正则表达式足够强大,可以计算重复次数并选择重复次数最少的那个,并避免数组上的循环。也不要忘记有 IE8 限制不支持原生 .map
-
嗯,
map和reduce有 polyfills。我也会质疑 IE8 的正则表达式功能。请注意,Microsoft 不再支持 IE8,因此应该就该浏览器进行一些严肃的安全讨论...
标签: javascript jquery arrays filtering