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?
5 réponses
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; }
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);
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);
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)
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);
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.