Javascript 取一个字符串,计算它的值,找出是否有一个数字,然后将字符串的一部分重复该次数?
我在写代码时遇到了这个问题, 您有一个特定字符串,其格式如下:Javascript 取一个字符串,计算它的值,找出是否有一个数字,然后将字符串的一部分重复该次数?,javascript,Javascript,我在写代码时遇到了这个问题, 您有一个特定字符串,其格式如下: d ae2 n s 现在我们要用一种特殊的方式来解读它 按空格将其拆分为不同的部分,形成一个类似[“d”、“ae2”、“n”、“s”的数组 计算数组的每个元素,并找出其中是否有数字 如果有数字,则重复字符串的次数 将其添加到数组中并继续。 所以输出数组应该是 我已经试了很多,但一无所获 我之前使用过此代码,但它以第二个字符串结尾: var str = "d ae2 n s" var res = str.split(" "); a
d ae2 n s
现在我们要用一种特殊的方式来解读它
var str = "d ae2 n s"
var res = str.split(" ");
alert(res.length);
for(var x = 0; x < res.length; x++ ){
var std = res[x];
var fun = checkNum(std);
if(fun === true){
var numbers = str.match(/\d+/g).map(Number);
var index = res.indexOf(std);
var result = std.replace(/[0-9]/g, '');
var res2 = result.repeat(numbers);
res[index] = res2;
}
else{
continue;
}
for(var i = 0; i < res.length; i++ ){
console.log(res[x]);
}
}
function checkNum(t){
return /\d/.test(t);
}
// I am a terible coder :/
var str=“d ae2 n s”
var res=str.split(“”);
警报(res.length);
对于(var x=0;x预期输出:[“d”、“ae”、“ae”、“n”、“s”]您只需在数组上循环,然后填充另一个数组,该数组将在检查数字后保存您的结果:
const results=[];
“d ae2 n s”。拆分(“”)。forEach(令牌=>{
const match=token.match(/\d+/);
如果(匹配){
const newStr=token.split(/\d/)[0];
for(设i=0;i您可以执行以下操作:
const str1='d ae2 n s';
const str2='e d aefg4 m n s';
常量正则表达式=/\d+/;
const getResult=input=>input.split(“”).reduce((a,c)=>{
常数n=c.match(正则表达式);
返回n
?[…a.concat(c.replace(n.))。重复(n)。trim()。split(“”))]
:[…a,c];
}, []);
console.log(getResult(str1));
console.log(getResult(str2))代码>使用和方法以及
正则表达式替换
/[^0-9]/
-所有非数字字符
/[0-9]/
-所有数字字符
var str='d ae2 n s'
var res=str
.拆分(“”)
.flatMap(i=>
数组(+i.replace(/[^0-9]/g',)|1)
.填充(即替换(/[0-9]/g.))
)
console.log(res)
您可以查看Seblor的答案以获得优化的逻辑。我已经修改了您的代码,这样您就可以很容易地理解在执行此操作时出现的错误。我已将注释添加到您的代码中,并在其中更改了内容:
var str = "d ae2 n s"
var res = str.split(" ");
// create a variable to store the output.
var output = [];
for(var x = 0; x < res.length; x++ ){
var std = res[x];
var fun = checkNum(std);
if(fun === true){
// map returns an array, so take the first element, it will be your number.
var numbers = str.match(/\d+/g).map(Number)[0];
var index = res.indexOf(std);
var result = std.replace(/[0-9]/g, '');
// instead of doing the repeat and updating the current index,
// push the result, i.e. the current string to be repeated "numbers" times into
// the output array.
for (var i = 0; i < numbers; i++) {
output.push(result)
}
}
else{
// if does not contain any number, push the current item to ouput
output.push (std);
continue;
}
}
function checkNum(t){
return /\d/.test(t);
}
console.log(output);
var str=“d ae2 n s”
var res=str.split(“”);
//创建一个变量来存储输出。
var输出=[];
对于(var x=0;x
您可以尝试以下方法:
let str = "d ae2 n s"
let split = str.split(" ")
let rx = new RegExp("[0-9]")
let res = [];
split.forEach(s => {
if(rx.exec(s) !== null) {
let rxResult = rx.exec(s)
let count = rxResult[0];
let matchIdx = rxResult[1];
for(let i = 0; i < count; i++) {
res.push(s.replace(count, ""))
}
} else {
res.push(s);
}
})
让str=“d ae2 n s”
let split=str.split(“”)
设rx=newregexp(“[0-9]”)
设res=[];
split.forEach(s=>{
如果(rx.exec)!==null){
设rxResult=rx.exec
let count=rxResult[0];
设matchIdx=rxResult[1];
for(设i=0;i
您可以使用阵列原型reduce
和filter
const输入='dae2 n s';
常量输出=输入。拆分(“”)。减少((内存,当前)=>{
常量numberIndex=current.split(“”).findIndex(c=>!isNaN(c));
const newCurrent=current.split(“”).filter((u,index)=>index!==numberIndex.join(“”);
如果(numberIndex!=-1){
for(设i=0;i 控制台日志(输出)代码>总是很高兴看到有人修改操作代码,让他明白什么是错误的谢谢:)我同意。我认为它提供了洞察力,也许还鼓励人们建立逻辑。干杯:)高“整洁”水平!CoolPeople不应该再使用var
。自ECMAScript 2015以来,这被认为是不好的做法。同意,切换到let
。然而,例如Douglas Crockford声称,var
非常好,如果你知道你在做什么:)是的,var
仍然可以是“好的”,但是它实际有用的用例几乎不存在。根据我所能找到的,道格拉斯·克罗克福德所说的是:“在极端情况下,var可能仍然有用,比如机器生成的代码,但我正在努力扩展。”因此,var
不应该出现在任何StackOverflow答案中,IMHO。感谢您编辑您的答案:)并感谢您就var
s和let
s:)进行了富有成效的讨论
let str = "d ae2 n s"
let split = str.split(" ")
let rx = new RegExp("[0-9]")
let res = [];
split.forEach(s => {
if(rx.exec(s) !== null) {
let rxResult = rx.exec(s)
let count = rxResult[0];
let matchIdx = rxResult[1];
for(let i = 0; i < count; i++) {
res.push(s.replace(count, ""))
}
} else {
res.push(s);
}
})