Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从字符串中获取奇偶位置字符?_Javascript_String_Character - Fatal编程技术网

Javascript 如何从字符串中获取奇偶位置字符?

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

我试图找出如何在Javascript中删除字符串中的每一个字符(从第一个字符开始)。 例如,字符串“This is a test!”应该变成“hsi etTi sats!” 我还想将每个删除的字符保存到另一个数组中

我尝试过使用替换方法和拼接方法,但无法使它们正常工作。主要是因为“替换”只替换第一个字符

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;iconsole.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