Dites-moi, comment puis-je convertir de manière optimale une chaîne comme

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";

À un tableau comme

const range = [
    {
        min: 1350,
        max: 1350,
    },
    {
        min: 1351,
        max: 1351,
    },
    {
        min: 1390,
        max: 1391,
    },
    {
        min: 1401,
        max: 1401,
    },
    {
        min: 1402,
        max: 1407,
    },
];

?

En d'autres termes, vous devez créer un tableau de plages de nombres à l'aide d'une chaîne dans laquelle ces plages de nombres sont explicitement spécifiées.

Le plus évident des algorithmes possibles est:

1) divisez la chaîne à l'aide d'un délimiteur ,

2) les parties résultantes sont nettoyées des espaces en utilisant la commande trim

3) vérifier si la pièce est un numéro

4) sinon, divisez la pièce à l'aide du délimiteur -

5) les pièces obtenues sont nettoyées des espaces à l'aide de la commande trim,

6) Vérifiez que la quantité de composant eq 2 et son nombre

Mais est-il possible de le rendre plus optimal, plus beau, plus efficace?

0
Zhihar 16 avril 2018 à 10:55

5 réponses

Meilleure réponse

Vous pouvez utiliser .split() et .map():

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";

const range = data.split(",").map(s => {
  let [min, max = min] = s.split("-");

  return {min: Number(min), max: Number(max)}
});

console.log(range);
.as-console-wrapper { max-height: 100% !important; top: 0; }
5
Mohammad Usman 16 avril 2018 à 07:59

Ce code vous aidera.

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
var arr = data.split(',');
const range = [];
for(var i=0; i< arr.length; i++){
var b = arr[i].split('-');
if(!b[1])b[1]=b[0];
var obj = new Object();
obj.min = parseInt(b[0]);
obj.max = parseInt(b[1]);
range.push(obj);
}
console.log(range);
0
Wilson 16 avril 2018 à 08:20

Vous pouvez utiliser la méthode split en combinaison avec la méthode reduce.

La méthode Reduce () applique une fonction à un accumulateur et à chaque élément du tableau (de gauche à droite) pour le réduire à une seule valeur.

Utilisez également l'opérateur + pour forcer le résultat sur Number.

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
const array = data.split(', ').reduce(function(arr, elem){
   var [min, max] = elem.split('-');
   arr.push({
      min : + min,
      max: + (max || min)
   });
   return arr;
},[]);
console.log(array);
1
Mihai Alexandru-Ionut 16 avril 2018 à 07:59

Essayez quelque chose comme ceci:

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407"

const result = data
  .split(/\s*,\s*/)
  .map(pair => {
    const [min, max = min] = pair
      .split(/\s*-\s*/)
      .map(Number)

    return {
      min,
      max
    }
  })

console.log(result)
2
dfsq 16 avril 2018 à 08:31

Je pense que la manière simple et bien compréhensible serait de parcourir les valeurs et de vérifier si elles ont une valeur de plage (avec trait d'union) et de créer l'objet en conséquence pour le tableau range.

const data = "1350, 1351, 1390-1391, 1401, 1402 - 1407";
var range = [];
data.split(',').forEach((val)=>{
  var obj = {};
  if(val.indexOf('-') === -1 ){
    obj.min = val;
    obj.max = val;
  } else {
    obj.min = val.split('-')[0].trim();
    obj.max = val.split('-')[1].trim();
  }
  range.push(obj);
});

console.log(range);
0
Ankit Agarwal 16 avril 2018 à 08:02