取一个字符串,求值,然后查找是否存在一个数字,然后重复该字符串部分的次数?

时间:2019-04-02 06:49:11

标签: javascript

我正在编写代码,遇到了这个问题, 您具有以下格式的特定字符串:

 d ae2 n s

现在我们必须以一种特定的方式对此进行解码,

  1. 通过空格将其拆分为不同的部分,以形成类似[“ d”,“ ae2”,“ n”,“ s”]的数组

  2. 求值数组的每个元素,并找出其中是否有数字。

  3. 如果有数字,请重复该字符串多次。

  4. 将其添加到阵列中并继续。 所以输出数组应该是

["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”]

6 个答案:

答案 0 :(得分:3)

使用this answerfill()方法以及

正则表达式替换

  • /[^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原型reducefilter

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);

希望这对您有帮助