Функция усеченных слов в javascript (изучение кода додзё) - PullRequest
2 голосов
/ 09 июня 2009

'Усеченные слова' будут принимать строку слов и возвращать только первые, скажем, 10 слов.

В dojo (библиотека javascript) у них есть такая функция, код которой такой:

truncatewords: function(value, arg){
    // summary: Truncates a string after a certain number of words
   // arg: Integer
   //              Number of words to truncate after
   arg = parseInt(arg);
   if(!arg){
           return value;
   }

   for(var i = 0, j = value.length, count = 0, current, last; i < value.length; i++){
           current = value.charAt(i);
           if(dojox.dtl.filter.strings._truncatewords.test(last)){
                   if(!dojox.dtl.filter.strings._truncatewords.test(current)){
                           ++count;
                           if(count == arg){
                                   return value.substring(0, j + 1);
                           }
                   }
           }else if(!dojox.dtl.filter.strings._truncatewords.test(current)){
                   j = i;
           }
           last = current;
   }
   return value;
}

, где dojox.dtl.filter.strings._truncatewords. равно /(&.*?;|<.*?>|(\w[\w-]*))/g

Почему это не написано так:

function truncate(value,arg) {
    var value_arr = value.split(' ');
    if(arg < value_arr.length) {
        value = value_arr.slice(0,arg).join(' '); }
    return value;
}

а в чем различия?

Ответы [ 4 ]

3 голосов
/ 09 июня 2009

Ваше разделение должно учитывать, что любая последовательность пустых символов является разделителем слов. Вы должны разделить на регулярное выражение, как \s+.

Но, кроме этого, кажется, что код додзё принимает в качестве слов сущности и теги xml. Если вы знаете, что в вашей строке нет таких вещей, ваша реализация может помочь. Однако будьте осторожны, чтобы ваш фрагмент не превышал количество найденных слов, для этого может потребоваться небольшая проверка.

0 голосов
/ 10 июня 2009

регулярное выражение состоит из 3 частей

  1. &. * ?; будет соответствовать символьным объектам (например, &)
  2. <. *?> Будет соответствовать вещи в угловых скобках
  3. (\ w [\ w -] *) будет совпадать со строками, начинающимися с [a-zA-Z0-9_], за которыми следует тире

это не просто разделение на пространство. Он ищет вещи, которые, по его мнению, могут быть частью слова, и как только он находит то, чего нет, он увеличивает количество слов.

Он должен принимать список, разделенный запятой или каналом, и работать, а также список, разделенный пробелами.

0 голосов
/ 10 июня 2009
  1. function объявление: это, вероятно, объект javascript, и использование function_name: function(params) {... помогает сохранить javascript вне глобальной области.
  2. Проверяя переменную arg, они гарантируют, что передано целое число. Использование parseInt() позволит принять как 10, так и "10".
  3. Этот метод может обрабатывать больше разделителей, чем пробелов в используемом регулярном выражении.
  4. Этот код безопасен для переполнения массива. Вы не можете сосчитать до 10, если в value всего 8 слов. В противном случае вы получите массив вне границ или ошибка объекта не существует.
0 голосов
/ 09 июня 2009

Код, который вы просматриваете, взят из библиотеки dtl, которая предназначена для поддержки языка шаблонов django. (http://www.dojotoolkit.org/book/dojo-book-0-9/part-5-dojox/dojox-dtl). Я уверен, что код там не для простого разделения строк, а скорее для анализа шаблонов, которые они используют.

Кроме того, глядя на это регулярное выражение, они обрабатывают намного больше сценариев, чем просто пробелы ... например, <. *?> Заставит любую группу слов, заключенную в открывающий и закрывающий теги, считать " слово».

...