0 votes

manipulation de chaînes en javascript

J'ai une longue chaîne avec En-têtes y Sous-titres . Chaque en-tête est censé avoir un sous-en-tête, mais le prétraitement des chaînes de caractères ne le fait pas. J'ai besoin de le manipuler de manière à ce que chaque en-tête ait un sous-en-tête.

Chaque en-tête qui n'a pas de chaîne a un point de référence sous un autre en-tête. L'en-tête auquel il manque le sous-titre doit récupérer le sous-titre de l'en-tête parent/prochain immédiat de la référence.

Voilà à quoi ça ressemble :

Header 1
subheader - somedata A
text
reference-header-3
stuff in the way

Header 2
subheader - somedata B
stuff in the way
stuff in the way

Header 3
stuff in the way
stuff in the way
reference-header-5

Header 4
subheader - somedata C
some text

Header 5
more text

Je dois faire en sorte que ce soit comme ça :

Header 1
subheader - somedata A
text
reference-header-3
stuff in the way

Header 2
subheader - somedata B
stuff in the way
stuff in the way

Header 3
subheader - somedata A [this is copied from header 1]
stuff in the way
stuff in the way
reference-header-5

Header 4
subheader - somedata C
some text

Header 5
subheader - somedata A [this is copied from header 3]
more text

Si quelqu'un connaît une bibliothèque de chaînes de caractères qui peut aider à faire cela, ce serait génial. Je ne sais pas comment m'y prendre, je pense les convertir en éléments DOM pour pouvoir les parcourir avec jQuery, puis les reconvertir. Mais ça a l'air un peu bizarre.

Quelqu'un sait comment faire ?

Merci d'avance.

1voto

Vivin Paliath Points 40975

Si vous avez le contrôle sur le backend, vous devriez faire envoyer ces données en JSON. C'est la meilleure solution. C'est aussi relativement indolore. Vous ne devriez pas non plus utiliser jQuery pour cela (son utilisation n'est pas pertinente ici), à moins que vous n'utilisiez AJAX pour récupérer le JSON comme je l'ai décrit.

Ou vous pouvez faire quelque chose comme ça :

var str = "Header 1\none\ntwo\nthree\n\nHeader 2\nsubheader - one\ntwo\nthree\n\nHeader 3\none\ntwo\nthree\n";
var lines = str.split(/\n/);

var headerMap = {};
var currentHeader = "";

for(var i = 0; i < lines.length; i++) {

   var line = lines[i];
   line = line.replace(/^\s+/, "").replace(/\s+$/, ""); //trim whitespace

   if(/^Header [0-9]+$/.test(line) && line != currentHeader) {
      headerMap[line] = new Array();
      currentHeader = line;
   }

   //don't add blank lines
   if(line != "") {
      headerMap[currentHeader][headerMap[currentHeader].length] = line;
   }
}

Vous disposez maintenant d'une carte dont les clés sont les suivantes Header 1 y Header 2 et ainsi de suite. La valeur de chaque clé est un tableau qui contient les différents sous-titres. Il est facile d'itérer sur ces valeurs et de vérifier la toute première valeur du tableau pour voir si elle possède la balise subheader - préfixe. Si ce n'est pas le cas, vous pouvez l'ajouter.

Je viens de remarquer la deuxième partie. Je suppose que ce que vous pouvez faire après avoir fait ce qui précède est de faire une deuxième passe et d'analyser le fichier reference et y insérer les valeurs appropriées. La solution de Slak pourrait être une solution à passage unique, je pense (d'après la lecture rapide que j'en ai faite). OU vous pouvez ajouter un else-if au code ci-dessus (à l'intérieur de la boucle où il vérifie la présence de l'hédaer) pour vérifier s'il correspond à votre reference de la directive. Si c'est le cas, prenez la référence existante et ajoutez ce que vous avez (cela ne fonctionne que pour les références arrière). Si vous avez des références vers l'avant, vous devrez faire une deuxième passe.

0voto

SLaks Points 391154

Vous devez parcourir en boucle les lignes de la chaîne de caractères et construire une table de consultation faisant correspondre les références d'en-tête à leurs champs de données, puis ajouter chaque ligne à un fichier de type output le tableau.

Lorsque vous rencontrez un en-tête, définissez un drapeau pour indiquer que vous attendez un sous-titre.
Si l'indicateur est activé et que la ligne actuelle n'est pas un sous-titre, il faut rechercher la référence dans la table de consultation et ajouter une ligne de sous-titre au tableau de sortie avant la ligne actuelle.

Si la dernière ligne peut être un en-tête, vous devrez répéter cette vérification après la boucle.

Si la ligne de référencement est susceptible d'apparaître après l'en-tête, vous devrez vérifier et ajouter les sous-titres dans une deuxième boucle, en sens inverse, en passant par les éléments suivants output après le remplissage output et de remplir la table de consultation. Si c'est le cas, vous devez insérer les sous-titres en appelant splice .

Lorsque vous avez terminé, appelez output.join('\n') .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X