2016-08-25 1 views
1

Je suis un novice, faisant un peu d'exercice pour s'entraîner avec des tableaux. J'ai essayé de résoudre cela à partir des articles précédents, mais aucun ne semble avoir le scénario pertinent.Impossible d'obtenir deux variables à concaténer

Je souhaite générer de manière aléatoire des phrases en paragraphes à l'aide de phrases d'un tableau. J'ai la partie aléatoire de la génération de phrases qui fonctionne bien. Mais maintenant je veux pouvoir ajouter une virgule ou un arrêt complet à la fin de la phrase. Parce que chaque mot/phrase du tableau utilisé dans la phrase s'imprime avec un espace après, j'ai besoin d'ajouter un mot avec un point ou une virgule juste après pour éviter l'espace entre eux. Pour ce faire, j'ai créé une variable supplémentaire

// create a word and full stop to end a sentence// 
var addFullstop = ipsumText[Math.floor(Math.random() * ipsumText.length)] + ". "; 
var addComma = ipsumText[Math.floor(Math.random() * ipsumText.length)] + ", "; 

Ces variables fonctionnent de façon autonome. Ils impriment un mot au hasard avec une virgule ou un arrêt complet juste après eux.

Cependant, maintenant je ne peux pas trouver comment les ajouter à la fin de la phrase. J'ai essayé pas mal de versions référençant des articles ici, mais il me manque quelque chose, parce que quand je le teste, je n'ai rien à imprimer dans le journal de la console.

C'est ce que j'ai essayé le plus récemment.

// add the sentence and new ending together // 
var fullSentence = sentence(ipsumText) + addFullstop; 
console.log(fullSentence) 

Quelqu'un peut-il expliquer pourquoi cela ne fonctionnerait pas? Et proposez une solution à essayer? grâce

+0

Je copié le code dans le snipplet et a bien fonctionné. – epascarello

+0

Votre code fonctionne. Vous voudrez peut-être faire de votre 'addFullstop' une fonction, de sorte qu'il va générer un mot différent à chaque fois. En ce moment, il est affecté à une variable et ne change pas. – Josh

+0

https://jsfiddle.net/mqaowcjd/ cela fonctionne ici –

Répondre

1

violon Voir ES6: http://www.es6fiddle.net/isadgquw/

Votre exemple fonctionne. Mais considérons une approche différente qui est un peu plus flexible. Vous lui donnez le tableau de mots, combien de temps vous voulez que la phrase soit, et si vous voulez une fin à la phrase, passez en end, sinon, laissez-le et il ne sera pas utilisé.

La première ligne génère un tableau de longueur count qui est composé d'indices aléatoires à utiliser pour indexer dans le tableau de mots. La ligne suivante met ces index en correspondance avec des mots réels. La dernière ligne joint tous ces éléments dans une phrase séparée par un seul espace, avec une fin facultative de la phrase spécifiée par l'appelant.

const randomSent = (words, count, end) => 
    [...Array(count)].map(() => Math.floor(Math.random() * words.length)) 
        .map(i => words[i]) 
        .join(' ') + (end || '') 

randomSent (['one','two','x','compound word','etc'], 10, '! ') 
// x x one x compound word one x etc two two! 

Pour le rendre plus flexible, pensez à créer une fonction pour chaque tâche. Le code est réutilisable, spécifique, et pas de variables mutables sont utilisées, le rendant facile à tester, comprendre et composer comme bon vous semble:

const randInt = (lower, upper) => 
    Math.floor(Math.random() * (upper-lower)) + lower 

const randWord = (words) => words[randInt(0, words.length)] 

const randSentence = (words, len, end) => 
    [...Array(len)].map(() => randWord(words)) 
        .join(' ') + (end || '') 

const randWordWithEnd = (end) => randWord(ipsumText) + end 
const randWordWithFullStop = randWordWithEnd('. ') 
const randWordWithComma = randWordWithEnd(', ') 

// Now, test it! 
const fullSentWithEnd = randSentence(ipsumText, 8, '!!') 
const fullSentNoEnd = randSentence(ipsumText, 5) 
const fullSentComposed = fullSentNoEnd + randWordWithFullStop 

Lien à nouveau pour des raisons pratiques: http://www.es6fiddle.net/isadgquw/

+0

Merci pour le temps d'y répondre. – garrethwills

+0

J'aime l'idée de la flexibilité du deuxième violon. La première fonction est-elle ici la création de la longueur de la phrase, alors que la seconde sélectionne les mots réels à utiliser, la même que la top-violon? Puis-je juste vérifier, désolé si c'est évident - sur la 5ème ligne de code <[... Array (len)> est la partie ouverte [et ... du code ou juste un raccourci?Je n'ai jamais vu ça avant. juste essayer de comprendre comment cela fonctionne. – garrethwills

+0

@garrethwills 'randInt' (je suppose que vous voulez dire cela quand vous dites" première fonction ") vous donne un entier aléatoire dans la gamme' [lower, upper) '. 'randWord' sélectionne alors un mot aléatoire du tableau' words' que vous lui transmettez, en utilisant la fonction 'randInt'. Le '...' est l'opérateur [spread] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) et étend 'Array (len)' inline. Le résultat est le nombre 'len' d'éléments' undefined' qui sont ensuite utilisés dans le tableau littéral '[]' pour vous donner un tableau initial pour pouvoir 'map' (essentiellement tricher pour remplacer une boucle' for'). – Josh