Javascript 如何从字符串中获取奇偶位置字符?
我试图找出如何在Javascript中删除字符串中的每一个字符(从第一个字符开始)。 例如,字符串“This is a test!”应该变成“hsi etTi sats!” 我还想将每个删除的字符保存到另一个数组中 我尝试过使用替换方法和拼接方法,但无法使它们正常工作。主要是因为“替换”只替换第一个字符Javascript 如何从字符串中获取奇偶位置字符?,javascript,string,character,Javascript,String,Character,我试图找出如何在Javascript中删除字符串中的每一个字符(从第一个字符开始)。 例如,字符串“This is a test!”应该变成“hsi etTi sats!” 我还想将每个删除的字符保存到另一个数组中 我尝试过使用替换方法和拼接方法,但无法使它们正常工作。主要是因为“替换”只替换第一个字符 function encrypt(text, n) { if (text === "NULL") return n; if (n <= 0) return text; var
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
}
}
函数加密(文本,n){
if(text==“NULL”)返回n;
如果(n
函数加密(文本){
text=text.split(“”);
var removed=[]
var encrypted=text.filter((字母、索引)=>{
如果(索引%2==0){
移除。按下(字母)
返回false;
}
返回真值
}).join(“”)
返回{
完整:加密+删除。加入(“”),
加密:加密,,
移除:移除
}
}
log(加密(“这是一个测试!”)
使用正则表达式和可能会更容易。替换:在单独的捕获组中捕获两个字符,将第一个字符添加到字符串中,然后替换为第二个字符。然后,您将需要的输出的前一半放在一个字符串中,第二个放在另一个字符串中:只需将它们连接在一个字符串中即可d返回:
函数加密(文本){
让removedText='';
const replacedText1=text.replace(/()(?)/g,(u,firstChar,secondChar)=>{
//如果比赛是在最后,
//字符串的字符数为奇数:
如果(!secondChar)secondChar='';
//从字符串中删除firstChar,同时将其添加到removedText:
removedText+=firstChar;
返回secondChar;
});
返回replacedText1+removedText;
}
console.log(encrypt('This a test!');
使用.reduce()
创建您想要的两个数组非常简单
函数加密(文本){
返回文本。拆分(“”)
.reduce(({奇数,偶数},c,i)=>
i%2?{奇数:[奇数,c],偶数}:{奇数,偶数:[偶数,c]}
,{奇数:[],偶数:[]})
}
console.log(encrypt(“这是一个测试!”);
我认为您的思路是正确的。您错过的是replace使用的是字符串或RegExp
replace()方法返回一个新字符串,其中包含替换所替换的模式的部分或全部匹配项。该模式可以是字符串或RegExp,替换项可以是字符串或为每个匹配项调用的函数。如果模式是字符串,则只替换第一个匹配项
资料来源:
如果要替换值(而不是正则表达式),则仅替换该值的第一个实例。若要替换指定值的所有引用,请使用全局(g)修饰符
资料来源:
因此,我的建议是继续使用replace并将正确的RegExp传递给函数,我想您可以从这个示例中看出-这将删除char't'的每一秒出现:
let count=0;
让testString='test';
log('original',testString);
//RegExp中的全局修饰符
让result=testString.replace(/t/g,函数(匹配){
计数++;
返回(计数%2==0)?“”:匹配;
});
console.log('removed',result);
您可以使用%
运算符将字符串中的字符分组到单独的数组中。用于将2D数组返回到单独的变量中
let str=“这是一个测试!”;
常量[偶数,奇数]=[…str]。reduce((r,char,i)=>(r[i%2]。push(char,r),[[],[]))
console.log(奇数连接(“”))
console.log(偶数.join(“”))
像这样吗
var text=“这是一个测试!”
var result=“”
var rest=“”
对于(变量i=0;i console.log(结果+rest)
可能带有拆分、筛选和加入:
const remaining = myString.split('').filter((char, i) => i % 2 !== 0).join('');
const deleted = myString.split('').filter((char, i) => i % 2 === 0).join('');
你可以拿一个数组并拼接,然后把每一个第二项推到数组的末尾
函数加密(字符串){
变量数组=[…字符串],
i=0,
l=array.length>>1;
虽然(i我不知道您有多关心性能,但是使用正则表达式不是很有效。
对相当长的字符串进行的简单测试表明,使用filter函数平均快3倍左右,这在非常长的字符串或许多短字符串上执行时会产生很大的差异
功能测试(func,n){
var text=“”;
对于(变量i=0;i{
//如果比赛是在最后,
//字符串的字符数为奇数:
如果(!secondChar)secondChar='';
//从字符串中删除firstChar,同时将其添加到removedText:
removedText+=firstChar;
返回secondChar;
});
返回replacedText1+removedText;
}
函数加密(文本){
text=text.split(“”);
var=”;
var encrypted=text.filter((字母、索引)=>{
如果(索引%2==0){
删除+=字母;
返回false;
}
返回真值
}).join(“”)
返回加密+删除
}
var timeREGEX=测试(encryptREGEX,10000000);
var timeFilter=test(加密,10000000);
console.log(“使用过滤器更快”,timeREGEX/timeFilter,“times”)
是的,我知道。这就是为什么我试图找到一个更好的解决方案,因为我没有主意。使用过滤器方法怎么样?这样很容易将删除的元素保存到数组中。这个函数中的n参数是什么?如果你向后循环它,它将工作:(var i=text.length-1;i>=0;i-=2)
。索引将是正确的。“!”是missi