ive lisait tout en ligne mais ce n'est pas exactement ce dont j'ai besoin J'ai besoin de quelque chose pour me procurer p> Utiliser 1 La réponse doit être L'idée de celui-ci si vous utilisez je ne veux pas utiliser de boucle est un moyen de long, surtout lorsque votre existe une regex que je peux utiliser ou une fonction que je ne suis pas au courant? P> Mettre à jour em> p> J'essaie de certains comment implémenter vos réponses mais lorsque j'utilise Dès que je l'ai trouvé, j'accepterai la réponse. P> P> ABCDE code>
Utilisation 2 La réponse doit être 12345 code>
Utilisation 3 La réponse doit être B3E CODE> P> 1 code> Il saisit 1 code> Skips 1 code>
L'idée derrière elle si vous utilisez 2 code> Il saisit 2 code> Skips 2 code>
l'idée derrière si vous utilisez 3 code> il saisit 3 code> skips 3 code> p> x code> est plus long que 300000 caractères. p> 1 code> c'est quand je suis confronté au problème. J'ai mentionné d'essayer de rester à l'écart des boucles La raison est des ressources sur le serveur. Plus les clients se connectent plus lentement, tout devient. Jusqu'ici Array.filter semble beaucoup plus rapide. P>
4 Réponses :
Comme d'autres signalent, ce n'est pas comme des expressions régulières sont magiques; Il y aurait toujours un mécanisme de bouclage sous-jacent. Ne vous inquiétez pas cependant, quand il s'agit de boucles, 300 000 ne sont rien -
p>
const recur = (...values) =>
({ recur, values })
const loop = f =>
{ let acc = f()
while (acc && acc.recur === recur)
acc = f(...acc.values)
return acc
}
const everyNth = (s, n) =>
loop
( (acc = '', x = 0) =>
x >= s.length
? acc
: recur(acc + s[x], x + n)
)
const s = 'abcdefghij'.repeat(30000)
console.time('loop/recur')
const result = everyNth(s, 2)
console.timeEnd('loop/recur')
// loop/recur: 31.615 ms
console.log(result)
console.log(result.length)
// acegiacegiacegiacegiacegiacegiacegia ...
// 150000Puisque je ne suis pas un expert de regex, j'utiliserais des fonctions de fantaisie ES6 pour filtrer vos caractères.
p>
var x = 'a1b2c3d4e5' var n = 2; var result = [...x].filter((char, index) => index % n == 0); console.log(result);
Cela copie toute la chaîne et appelle une Lambda pour chaque élément. En utilisant le plus petit intervalle 2, (un intervalle de 1 copierait simplement la chaîne entière), nous connaissons déjà au moins 50% des éléments seront ignorés. Pour un intervalle de 3, au moins 66% seront ignorés. Pour une chaîne d'entrée significativement importante, comme celle en question, voyez-vous pourquoi cela est terriblement inefficace maintenant?
@ user633183 Je prouverais ma fonction dans un jsfiddle, mais elle a manqué de mémoire tout en exécutant la fonction ...: p merci pour la clarification détaillée
@Davidthomas qui est simplement faux faux. Dans ma réponse, vous pouvez voir que j'utilise un simple index qui accède directement aux sous-chaînes. La taille de l'intervalle détermine le nombre d'éléments pouvant être ignorés à la fois. NB Vous faites pas i> devez effectuer des opérations sur chaque caractère.
comme variante:
comme la réponse de Robb216; S'il vous plaît voir mon commentaire
Oui, tu as raison. Cette solution n'est appropriée que si le calcul du code est préféré à l'efficacité de l'exécution,
J'ai fait une mise à jour de ma réponse qui vous montre comment réaliser la brièveté et la rapidité du code sans faire de sacrifices comme ceux-ci
J'aime votre suggestion mais quand vous utilisez 1, cela ne fonctionne pas. C'est un peu le problème que j'ai.
Ne devrait-il pas retourner la même chaîne si vous demandez chaque 1er personnage?
Ce que je suggérerais, d'éviter d'avoir à itération sur toute la matrice, est de marcher directement dans le Voici quelques saveurs: P> plus es6-y: p> cette solution considère Ce commentaire comme étant valide. p> p> NTH code> 's.
associé Stackoverflow.com/questions/3636010/...
Comment obtiendriez-vous
b3e code>? Comme .. 3ème, 6ème et 9ème éléments?github.com/hustc/slice.js sonne comme ce que vous cherchez
Le pour la boucle n'est-il pas la même chose, peu importe la durée de la ficelle?
Le moteur Regex va utiliser des boucles internes en interne, probablement de manière beaucoup moins efficace que le code spécialement conçu pour votre problème. Ce n'est pas fait de magie.
Les réponses existantes ont une différence dans la manière dont ils traitent Haut Unicode (mais aucun d'entre eux n'est nécessairement correct à cet égard). Avez-vous besoin de gérer le texte non-ASCII?
Il semble y avoir quelque chose avec vos résultats attendus lorsque vous avez reçu
1 code> comme le nième caractère à extraire. Chaque premier caractère dea1b2c3d4e5 code> seraita1b2c3d4e5 code> ou suis-je trompé?Donc, l'idée derrière elle est de saisir 1 sauter 1 puis pour 2, il serait grab 2 Skip 2, etc.