-3
votes

J'ai besoin d'extraire chaque nième caractère d'une corde en JavaScript

ive lisait tout en ligne mais ce n'est pas exactement ce dont j'ai besoin xxx

J'ai besoin de quelque chose pour me procurer

Utiliser 1 La réponse doit être ABCDE Utilisation 2 La réponse doit être 12345 Utilisation 3 La réponse doit être B3E

L'idée de celui-ci si vous utilisez 1 Il saisit 1 Skips 1 L'idée derrière elle si vous utilisez 2 Il saisit 2 Skips 2 l'idée derrière si vous utilisez 3 il saisit 3 skips 3

je ne veux pas utiliser de boucle est un moyen de long, surtout lorsque votre x est plus long que 300000 caractères.

existe une regex que je peux utiliser ou une fonction que je ne suis pas au courant?

Mettre à jour

J'essaie de certains comment implémenter vos réponses mais lorsque j'utilise 1 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.

Dès que je l'ai trouvé, j'accepterai la réponse.


8 commentaires

associé Stackoverflow.com/questions/3636010/...


Comment obtiendriez-vous b3e ? 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 comme le nième caractère à extraire. Chaque premier caractère de a1b2c3d4e5 serait a1b2c3d4e5 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.


4 Réponses :


2
votes

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 ...
// 150000


0 commentaires

1
votes

Puisque 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);


3 commentaires

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 devez effectuer des opérations sur chaque caractère.



1
votes

comme variante: xxx


5 commentaires

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?



0
votes

Ce que je suggérerais, d'éviter d'avoir à itération sur toute la matrice, est de marcher directement dans le NTH 's.

Voici quelques saveurs: xxx

plus es6-y: xxx

cette solution considère Ce commentaire comme étant valide.


0 commentaires