2016-10-25 57 views
2

我試圖編寫一個函數來縮寫一個句子中的單詞,其中有一個單詞中有4個或更多個字符。所以「大象車真的很有趣!」變成「E6t-r3s很有趣!」。Javascript中的縮寫語句

我設法起牀,我略所有的話,但我無法弄清楚三件事情。

  1. 我的代碼要求字符串以空格結尾。如何重新組織它,所以它不必結束它的工作空間?
  2. 我的代碼不會爲3點或更少的字符的話正常工作 - 這些都不是縮寫(我試過一個else if語句if語句之後,它讓我感到困惑)
  3. 它不佔逗號,分號或其他標點符號。有沒有辦法做到這一點,而不是用一堆===語句填充if條件?

編輯:我也會對非RegEx答案感興趣(雖然已發佈的答案有幫助),因爲我是編程新手,並且仍在努力找出循環。

function abbrv(str) { 
 
\t var word="" 
 
    var newStr="" 
 
    var counter= 0 
 
    var oldCounter= 0 
 
     for (var i=0; i<str.length; i+=1){ 
 
      counter+= 1 
 
      word+= str[i] 
 
      if(str[i]===" "||str[i]==="-"){ 
 
      newStr += word[oldCounter]+(counter-(oldCounter+3)).toString()+word[counter-2]+str[i] 
 
      oldCounter= counter 
 
      } 
 
     } 
 
\t console.log(newStr) 
 
} 
 

 
abbrv("Elephant-rides are really fun ");

回答

1

你可以看看每個字符,並檢查是否有不信重置計數器。如果找到一封信,請檢查計數並在計數爲零時追加。

function abbrv(str) { 
 
    var newStr = "", 
 
     count = 0, 
 
     i; 
 

 
    for (i = 0; i < str.length; i++) { 
 
     if (str[i] === " " || str[i] === "-") { 
 
      if (count > 0) { 
 
       newStr += count > 3 ? count - 2 : str[i - 2]; 
 
       newStr += str[i - 1]; 
 
      } 
 
      newStr += str[i]; 
 
      count = 0; 
 
      continue; 
 
     } 
 
     if (count === 0) { 
 
      newStr += str[i]; 
 
     } 
 
     count++; 
 
    } 
 
    if (count > 0) { 
 
     newStr += count > 3 ? count - 2 : str[i - 2]; 
 
     newStr += str[i - 1]; 
 
    } 
 
    return newStr; 
 
} 
 

 
console.log(abbrv("Elephant-rides are really funy"));
.as-console-wrapper { max-height: 100% !important; top: 0; }

或者你可以使用正則表達式,用於與縮寫代替的話。

function abbrv(str) { 
 
    return str.replace(/\w{4,}/g, function (s) { 
 
     var l = s.length; 
 
     return s[0] + (l - 2) + s[l - 1]; 
 
    }); 
 
} 
 

 
console.log(abbrv("Elephant-rides are really fun"));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

對長單詞使用'replace'和正則表達式是一個很好的補充!可能已經更好地保留了以前的帖子,並在我的回答下將其評論爲一個建議,雖然...之前有2個多功能答案,現在你只是我的一個補丁版本... – user3297291

+0

編輯也適用。謝謝。 – user3297291

2

你可以使用正則表達式\b匹配的話:

function abbrWord(word) { 
 
    if (word.length <= 3) return word; // This also filters out ", " or "-" 
 
    
 
    return word[0] + 
 
    (word.length - 2) + 
 
    word[word.length - 1]; 
 
} 
 

 
function abbrv(str) { 
 
    return str.split(/\b/) // Create an array of words and word boundaries 
 
    .map(abbrWord)   // for each item in the array, replace with abbr. 
 
    .join("");    // join items together to form a string 
 
    
 
} 
 

 
console.log(abbrv("Elephant-rides are really fun"))

注:

  • 很高興有你字縮寫句子分裂邏輯分離。這可以很容易地改變其中的一個,而不會影響其中一個
  • 使用正則表達式,有很多方法可以快速搜索特定的字符模式。請注意0​​和test
+0

哇哦謝謝。我對RegEx幾乎一無所知,但我明白了。感謝您的額外指針。 –

+0

不客氣。下面的答案由Nina使用'replace'簡化了'split','map','join'。也許很高興能夠加入! – user3297291