Самый быстрый / самый эффективный способ сравнить два строковых массива Javascript - PullRequest
5 голосов
/ 22 февраля 2010

Привет, мне было интересно, может ли кто-нибудь дать какой-нибудь совет о самом быстром / наиболее эффективном способе сжатия двух массивов строк в javascript.

Я разрабатываю что-то вроде облачного типа тегов, основанное на пользовательском вводе - ввод в форме письменного фрагмента текста, такого как статья в блоге или тому подобное.

Поэтому у меня есть массив, который я храню, чтобы слова не включались - есть, а, и т. Д. И т. Д.

На данный момент я делаю следующее:

Удалите все знаки препинания из входной строки, разбейте ее на токены, сравните каждое слово с массивом исключения и затем удалите все дубликаты.

Сравнения выполняются путем зацикливания каждого элемента в массиве exclude для каждого слова во входном тексте - это похоже на грубую силу и приводит к падению Internet Explorer на массивах из более чем нескольких сотен слов.

Я должен также упомянуть, что мой список исключений содержит около 300 пунктов.

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 5 ]

5 голосов
/ 22 февраля 2010

Я не уверен в целом подходе, но вместо того, чтобы строить огромный массив, а затем повторять его, почему бы не поместить "ключи" в объект, подобный карте, для более простого сравнения?

, например

var excludes = {};//object
//set keys into the "map"
excludes['bad'] = true;
excludes['words'] = true;
excludes['exclude'] = true;
excludes['all'] = true;
excludes['these'] = true;

Тогда, когда вы хотите сравнить ... просто сделайте

var wordsToTest = ['these','are','all','my','words','to','check','for'];
var checkWord;
for(var i=0;i<wordsToTest.length;i++){
  checkWord = wordsToTest[i];
  if(excludes[checkword]){
    //bad word, ignore...
  } else {
    //good word... do something with it
  }
}

разрешает эти слова через ['are','my','to','check','for']

2 голосов
/ 22 февраля 2010

Стоит попытаться объединить слова в одно регулярное выражение, а затем сравнить с этим. Оптимизация механизма регулярных выражений может позволить поиску пропустить вперед по тексту поиска гораздо эффективнее, чем вы могли бы сделать итерации по отдельным строкам.

0 голосов
/ 01 октября 2011

Я бы выбрал версию регулярного выражения

text = 'This is a text that contains the words to delete. It has some <b>HTML</b> code in it, and punctuation!';
deleteWords = ['is', 'a', 'that', 'the', 'to', 'this', 'it', 'in', 'and', 'has'];

// clear punctuation and HTML code
onlyWordsReg = /\<[^>]*\>|\W/g;
onlyWordsText = text.replace(onlyWordsReg, ' ');

reg = new RegExp('\\b' + deleteWords.join('\\b|\\b') + '\\b', 'ig');
cleanText = onlyWordsText .replace(reg, '');

// tokenize after this
0 голосов
/ 23 мая 2011

Я взял ответ Скунлиффа и изменил его следующим образом:

var excludes = ['bad','words','exclude','all','these']; //array

теперь позволяет создавать прототип функции, которая проверяет, находится ли значение внутри массива:

Array.prototype.hasValue= function(value) {
  for (var i=0; i<this.length; i++)
      if (this[i] === value) return true; 
  return false;
}

давайте проверим несколько слов:

var wordsToTest = ['these','are','all','my','words','to','check','for'];
var checkWord;
for(var i=0; i< wordsToTest.length; i++){
  checkWord = wordsToTest[i];
  if( excludes.hasValue(checkWord) ){
    //is bad word
  } else {
    //is good word
    console.log( checkWord );
  }
}

выход: * +1010 *

['are','my','to','check','for']
0 голосов
/ 22 февраля 2010

Вы можете использовать функцию хеширования для строк (я не знаю, есть ли у JS такая функция, но я уверен, что дядя Google может помочь;]). Затем вы вычислите хеши для всех слов в вашем списке исключений и создадите массив логических значений, проиндексированных этими хешами. Затем просто переберите текст и проверьте хэши слов в этом массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...