我正在编写代码,遇到了这个问题, 您具有以下格式的特定字符串:
d ae2 n s
现在我们必须以一种特定的方式对此进行解码,
通过空格将其拆分为不同的部分,以形成类似[“ d”,“ ae2”,“ n”,“ s”]的数组
求值数组的每个元素,并找出其中是否有数字。
如果有数字,请重复该字符串多次。
将其添加到阵列中并继续。 所以输出数组应该是
["d","ae","ae","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 :/
预期输入:d ae2 n s
预期输出:[“ d”,“ ae”,“ ae”,“ n”,“ s”]
答案 0 :(得分:3)
使用this answer和fill()
方法以及
正则表达式替换
/[^0-9]/
-所有非数字字符
/[0-9]/
-所有数字字符
var str = 'd ae2 n s'
var res = str
.split(' ')
.flatMap(i =>
Array(+i.replace(/[^0-9]/g, '') || 1)
.fill(i.replace(/[0-9]/g, ''))
)
console.log(res)
答案 1 :(得分:1)
您可以简单地遍历数组并填充另一个数组,该数组将在检查数字后保存结果:
const results = [];
"d ae2 n s".split(' ').forEach(token => {
const match = token.match(/\d+/);
if (match) {
const newStr = token.split(/\d/)[0];
for (let i = 0; i < match[0]; i++) {
results.push(newStr);
}
} else {
results.push(token)
}
})
console.log(results);
答案 2 :(得分:1)
您可以检查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);
答案 3 :(得分:0)
您可以这样做:
const str1 = 'd ae2 n s';
const str2 = 'e d aefg4 m n s';
const regex = /\d+/;
const getResult = input => input.split(' ').reduce((a, c) => {
const n = c.match(regex);
return n
? [...a.concat(c.replace(n, ' ').repeat(n).trim().split(' '))]
: [...a, c];
}, []);
console.log(getResult(str1));
console.log(getResult(str2));
答案 4 :(得分:0)
您可以尝试以下操作:
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);
}
})
答案 5 :(得分:0)
您可以使用Array原型reduce
和filter
const input = 'd ae2 n s';
const output = input.split(' ').reduce((memory, current) => {
const numberIndex = current.split('').findIndex(c => !isNaN(c));
const newCurrent = current.split('').filter((_, index) => index !== numberIndex).join('');
if(numberIndex !== -1) {
for(let i = 0; i < parseInt(current[numberIndex]); i++) {
memory.push(newCurrent);
}
} else {
memory.push(current);
}
return memory;
}, []);
console.log(output);
希望这对您有帮助