Mon code est le suivant:

var obj = { 'one ': '1 ', 'two ': '2 ', 'three ': '3 ', 'four ': '4 ', 'five ': '5 ', 'six ': '6 ', 'seven ': '7 ', 'eight ': '8 ', 'nine ': '9 ', 'zero ': '0 ',
  ' one': '1 ', ' two': '2 ', ' three': '3 ', ' four': '4 ', ' five': '5 ', ' six': '6 ', ' seven': '7 ', ' eight': '8 ', ' nine': '9 ', ' zero': '0 ',
};


var str = 'the store number is one two three four'
//Checking if the string has any numbers in words..
if(str.indexOf('one') > -1 || str.indexOf('two') > -1 || str.indexOf('three') > -1 || str.indexOf('four') > -1 || str.indexOf('five') > -1
|| str.indexOf('six') > -1 || str.indexOf('seven') > -1 || str.indexOf('eight') > -1 || str.indexOf('nine') > -1 || str.indexOf('zero') > -1) {
  str = str + ' ';
  //Looping each word in the array and replacing the number word in the string with the respective number
  for(var i in obj) {
    if (str.indexOf(i) !== -1){
     str = str.replace(i, obj[i])
      //console.log (i, obj[i])
     }

  }
console.log(str)
}

Ma tâche consiste à vérifier d'abord la chaîne si elle contient des nombres entre 0 et 9 (disons «zéro», «un», «deux» ... «neuf»). S'il y en a, je dois le remplacer par leurs valeurs entières respectives comme «0», «1».

Entrée: "le magasin est un deux trois quatre"
après la conversion devrait être:
Résultat: "le magasin est 1 2 3 4"

Le code ci-dessus fait le travail. Mais puis-je obtenir un code compressé avec regex ou quelque chose?

1
Chris Pioline 28 nov. 2017 à 06:38

3 réponses

Meilleure réponse

Le code de la question a deux conditions if redondantes, il peut être simplifié en:

var obj = { 'one ': '1 ', 'two ': '2 ', 'three ': '3 ', 'four ': '4 ', 'five ': '5 ', 'six ': '6 ', 'seven ': '7 ', 'eight ': '8 ', 'nine ': '9 ', 'zero ': '0 '};

var str = 'the store number is one two three four '; // if we don't add a space after the 'four' - it will not be replaced!
for(var i in obj) {
    while (str.indexOf(i) > -1) {
        str = str.replace(i, obj[i]);
    }
}
console.log(str); // the store number is 1 2 3 4 

Et non, regex ne rendra pas ce code plus concis!

0
alfasin 28 nov. 2017 à 04:11

Voici

'use strict';

const maps = [
    ['one', '1'],
    ['two', '2'],
    ['three', '3'],
    ['four', '4'],
    ['five', '5'],
    ['six', '6']
];

function convert(input) {
    if (typeof input !== 'string') {
        throw new TypeError(`Expected a string, got ${typeof input}`);
    }

    return maps.reduce((seed, map) => {
        input = input.replace(new RegExp(map[0], 'g'), map[1]);
        return input;
    }, input);
};


var str = 'the store number is one two three four'
console.log(convert(str));

Production

the store number is 1 2 3 4
-1
Tuan Anh Tran 28 nov. 2017 à 03:49

Je ne vois pas un grand avantage à utiliser regex ici. Cela semble appeler un simple remplacement de chaîne en utilisant des valeurs statiques connues.

Peut-être quelque chose comme ça

var str = 'the store number is one two three four'
var strArray = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']

strArray.forEach(function(thisStr) {
    if (str.toLowerCase().includes(thisStr)) {
        console.log("String includes " + thisStr);
    }
});

str = str.replace('zero','0').replace('one','1').replace('two','2').replace('three','3').replace('four','4').replace('five','5').replace('six','6').replace('seven','7').replace('eight','8').replace('nine','9');
console.log(str);
0
rickjerrity 28 nov. 2017 à 03:54
47523604