簡體   English   中英

如何從字符串中獲取奇數和偶數位置字符?

[英]How to get odd and even position characters from a string?

我試圖弄清楚如何從Javascript中的字符串中刪除第二個字符(從第一個字符開始)。 例如,字符串“這是一個測試!” 應該成為“ hsi etTi sats”! 我也想將每個刪除的字符保存到另一個數組中。

我嘗試使用replace方法和splice方法,但是無法使其正常工作。 主要是因為replace只替換第一個字符。

function encrypt(text, n) {
  if (text === "NULL") return n;
  if (n <= 0) return text;
  var encArr = [];
  var newString = text.split("");
  var j = 0;
  for (var i = 0; i < text.length; i += 2) {
    encArr[j++] = text[i];
    newString.splice(i, 1); // this line doesn't work properly
  }
}

您可以reduce字符串的字符,並使用%運算符將它們分組為單獨的數組。 使用解構使二維數組返回到單獨的變量

 let str = "This is a test!"; const [even, odd] = [...str].reduce((r,char,i) => (r[i%2].push(char), r), [[],[]]) console.log(odd.join('')) console.log(even.join('')) 

使用for循環:

 let str = "This is a test!", odd = [], even = []; for (var i = 0; i < str.length; i++) { i % 2 === 0 ? even.push(str[i]) : odd.push(str[i]) } console.log(odd.join('')) console.log(even.join('')) 

使用正則表達式和.replace可能會更容易:在單獨的捕獲組中捕獲兩個字符,將第一個字符添加到字符串中,然后替換為第二個字符。 然后,將需要的輸出的前一半放在一個字符串中,將第二個字符串放在另一個字符串中:將它們連接在一起並返回:

 function encrypt(text) { let removedText = ''; const replacedText1 = text.replace(/(.)(.)?/g, (_, firstChar, secondChar) => { // in case the match was at the end of the string, // and the string has an odd number of characters: if (!secondChar) secondChar = ''; // remove the firstChar from the string, while adding it to removedText: removedText += firstChar; return secondChar; }); return replacedText1 + removedText; } console.log(encrypt('This is a test!')); 

您可以采用一個數組並進行拼接,然后將每個第二項推到數組的末尾。

 function encrypt(string) { var array = [...string], i = 0, l = array.length >> 1; while (i <= l) array.push(array.splice(i++, 1)[0]); return array.join(''); } console.log(encrypt("This is a test!")); 

 function encrypt(text) { text = text.split(""); var removed = [] var encrypted = text.filter((letter, index) => { if(index % 2 == 0){ removed.push(letter) return false; } return true }).join("") return { full: encrypted + removed.join(""), encrypted: encrypted, removed: removed } } console.log(encrypt("This is a test!")) 

拼接不起作用,因為如果在for loop索引中從數組中刪除一個元素,則在刪除另一個元素時很可能會出錯。

使用.reduce()簡單,可以創建您想要的兩個數組。

 function encrypt(text) { return text.split("") .reduce(({odd, even}, c, i) => i % 2 ? {odd: [...odd, c], even} : {odd, even: [...even, c]} , {odd: [], even: []}) } console.log(encrypt("This is a test!")); 

如果需要,可以使用.join("")將它們轉換為字符串。

我認為您在正確的軌道上。 您錯過的替換是使用字符串或RegExp。

replace()方法返回一個新字符串,該字符串具有部分或全部模式匹配項,並由替換項替換。 模式可以是字符串或RegExp,而替換項可以是字符串或每個匹配項要調用的函數。 如果pattern是字符串,則只會替換第一個匹配項。

資料來源: String.prototype.replace()

如果要替換值(而不是正則表達式),則僅替換該值的第一個實例。 要替換所有出現的指定值,請使用全局(g)修飾符

來源: JavaScript String replace()方法

因此,我的建議是繼續使用replace並將正確的RegExp傳遞給該函數,我想您可以從此示例中弄清楚-這樣就消除了char't'的第二次出現:

 let count = 0; let testString = 'test test test test'; console.log('original', testString); // global modifier in RegExp let result = testString.replace(/t/g, function (match) { count++; return (count % 2 === 0) ? '' : match; }); console.log('removed', result); 

像這樣?

 var text = "This is a test!" var result = "" var rest = "" for(var i = 0; i < text.length; i++){ if( (i%2) != 0 ){ result += text[i] } else{ rest += text[i] } } console.log(result+rest) 

也許使用split,filter和join:

const remaining = myString.split('').filter((char, i) => i % 2 !== 0).join('');
const deleted = myString.split('').filter((char, i) => i % 2 === 0).join('');

我不知道您對性能有多重視,但是使用正則表達式不是很有效。 對相當長的字符串進行的簡單測試表明,使用過濾器功能的速度平均快了約3倍,這在處理非常長的字符串或許多很多短褲的字符串時會產生很大的不同。

 function test(func, n){ var text = ""; for(var i = 0; i < n; ++i){ text += "a"; } var start = new Date().getTime(); func(text); var end = new Date().getTime(); var time = (end-start) / 1000.0; console.log(func.name, " took ", time, " seconds") return time; } function encryptREGEX(text) { let removedText = ''; const replacedText1 = text.replace(/(.)(.)?/g, (_, firstChar, secondChar) => { // in case the match was at the end of the string, // and the string has an odd number of characters: if (!secondChar) secondChar = ''; // remove the firstChar from the string, while adding it to removedText: removedText += firstChar; return secondChar; }); return replacedText1 + removedText; } function encrypt(text) { text = text.split(""); var removed = ""; var encrypted = text.filter((letter, index) => { if(index % 2 == 0){ removed += letter; return false; } return true }).join("") return encrypted + removed } var timeREGEX = test(encryptREGEX, 10000000); var timeFilter = test(encrypt, 10000000); console.log("Using filter is faster ", timeREGEX/timeFilter, " times") 

過濾器與正則表達式-性能測試結果

實際上,使用數組存儲刪除的字母然后將它們連接起來比使用字符串並將字母串聯在一起要有效得多。
我在過濾器解決方案中將數組更改為字符串,以使其與正則表達式解決方案相同,因此它們的可比性更高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM