Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.02.2013, 16:14
Аспирант
Отправить личное сообщение для Esigns Посмотреть профиль Найти все сообщения от Esigns
 
Регистрация: 27.09.2012
Сообщений: 62

Удаление повторяющихся имейлов из строки
все привет. Есть строка имейлов с разделителем пробел :
email1@email.com email1@email.com email2@email.com email1@email.com

Строка может быть достаточно длинной(скажем 5-10К имейлов).
Есть ли способ более быстрый чем этот :
var arr = emails.split(" ");
var res = new array();
for(var i=0; i<arr.length; i++) {
    for(var j=0; j<arr.length; j++) {
         if(arr[i] == arr[j]) удаляю повторение из массива
    }
}

Вроде как есть способ решить задачу через replace, но я в регулярках совсем новичек и подобную регулярку буду составлять целый день, если вообще составлю.

Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 20.02.2013, 16:28
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Требует поддержки ES5:
var arr = [1,2,5,1,2,5,6,7,2];
var uniqued = arr.filter(function(e,i,a){return i == a.indexOf(e)});
alert( uniqued );
Ответить с цитированием
  #3 (permalink)  
Старый 20.02.2013, 16:37
Аспирант
Отправить личное сообщение для Esigns Посмотреть профиль Найти все сообщения от Esigns
 
Регистрация: 27.09.2012
Сообщений: 62

спасибо, вроде работает
Ответить с цитированием
  #4 (permalink)  
Старый 20.02.2013, 17:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,134

Esigns,
исполнение RegExp по заявке )))
<script type="text/javascript">
var str = "email5@email.com email1@email.com email2@email.com email1@email.com email2@email.com email3@email.com email1@email.com email1@email.com email2@email.com email1@email.com email2@email.com email3@email.com email5@email.com";
myRe = /(\S+@\S+)(?![\s\S]+?\1)/gm;
alert(str.match(myRe).join("\n"));
</script>

Последний раз редактировалось рони, 20.02.2013 в 17:34.
Ответить с цитированием
  #5 (permalink)  
Старый 20.02.2013, 17:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,134

хмм к адресам добавились теги но вроде работает.
Ответить с цитированием
  #6 (permalink)  
Старый 20.02.2013, 17:31
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

рони,
Да, к емейлам добавляются в JS тегах
Нун делать в [HTML]
<script type="text/javascript">
var str = 'email1@email.com email1@email.com email2@email.com email1@email.com';
eval('var obj = {'+ (' '+str+' ').replace(/\s+/g,'\":1,\"').replace(/^":1,|,"$/g,'')+'}');
var arr=[];for(var i in obj) {arr.push(i);}
alert(arr)
</script>

Последний раз редактировалось Deff, 21.02.2013 в 17:06.
Ответить с цитированием
  #7 (permalink)  
Старый 20.02.2013, 17:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,134

Deff,
вам только шифровки писать!
Ответить с цитированием
  #8 (permalink)  
Старый 21.02.2013, 10:29
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 322

Сообщение от Esigns Посмотреть сообщение
все привет. Есть строка имейлов с разделителем пробел :
email1@email.com email1@email.com email2@email.com email1@email.com

Строка может быть достаточно длинной(скажем 5-10К имейлов).
Есть ли способ более быстрый чем этот :
var arr = emails.split(" ");
var res = new array();
for(var i=0; i<arr.length; i++) {
    for(var j=0; j<arr.length; j++) {
         if(arr[i] == arr[j]) удаляю повторение из массива
    }
}

Вроде как есть способ решить задачу через replace, но я в регулярках совсем новичек и подобную регулярку буду составлять целый день, если вообще составлю.

Спасибо.
В исходном коде ошибка, нужно во внутреннем цикле
for(var j=0; j<arr.length; j++)
заменить на
for(var j=i+1; j<arr.length; j++)

Предлагаю свои два варианта:
1.
var res = emails.split( " " );
var tmp = {};
var i = 0;
while( i < res.length ) {
  var tmp2 = res[i].toUpperCase();
  if( tmp2 in tmp )
    res.splice( i, 1 );
  else {
    tmp[tmp2] = 1;
    ++i;
  }
}


2.
var res = emails.split( " " );

res.sort( function(a,b) { a=a.toUpperCase(); b=b.toUpperCase(); return a>b?1:a<b?-1:0; } );

var i = 1;
while( i < res.length ) {
  if( res[i-1].toUpperCase() == res[i].toUpperCase() )
    res.splice( i, 1 );
  else
    ++i;
}

(сорри за вложенный условный оператор )
Второй вариант нарушает исходный порядок, но это можно легко исправить, если нужно.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление пробелов в начале и конце строки CyMKuH Общие вопросы Javascript 6 22.03.2016 12:41
удаление строки до определённого символа Vampir3 Общие вопросы Javascript 2 04.09.2012 21:46
удаление произвольной строки таблица kayuga jQuery 1 12.01.2011 03:40
удаление строки pingvinchic Events/DOM/Window 1 25.02.2010 16:32
Удаление пробелов из строки thunder2 Общие вопросы Javascript 4 03.01.2010 21:02