Я объясню, что нужно. Надеюсь, вы можете помочь. У меня есть массив. Во-первых, два значения - вес, который не имеет значения, затем пробел и электронная почта .
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 раза.
Используется браузер IE8 с jQuery (должен использовать jQuery, потому что native .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);