2 votes

Obtenir plusieurs positions de caractères dans un tableau ?

Je veux obtenir la position des points et des virgules dans un tableau.

w.wer,ads,

devrait donner quelque chose comme :

[0] > 1
[1] > 5
[2] > 9

Comment cela peut-il être fait avec javascript ?

4voto

James Points 56229
function getPositions(regex, str) {
    var counts = [], m;
    while (m = regex.exec(str)) {
        counts.push(regex.lastIndex - m[0].length);
    }
    return counts;
}

// Usage:
getPositions(/[,.]/g, 'w.wer,ads,'); // => [1,5,9]

3voto

JaredPar Points 333733

Essayez ce qui suit

var getAllIndexesOf = function(str, toFind) {
  var all = [];
  for (var i = 0; i < str.length; i++) {
    if (toFind.indexOf(str[i]) >= 0) {
      all.push(i);
    }
  }
  return all;
}

var result = getAllIndexsOf("w.wer,ads,", [".", ","]);

2voto

James Hill Points 27532

Option 1

Il suffit de parcourir en boucle chaque caractère de la chaîne :

var myString = "w.wer,ads,";
var matchedIndexes = [];

for (var i = 0; i < myString.length; i++) {
    if (myString[i] == "," || myString[i] == ".") {
        matchedIndexes.push(i);
    }
}

Voici un violon en état de marche .

Option 2

Si vous voulez aller plus loin, vous pouvez créer un objet qui stocke la position y le caractère à cette position :

var myString = "w.wer,ads,";
var matchedIndexes = [];

for (var i = 0; i < myString.length; i++) {
    if (myString[i] == "," || myString[i] == ".") {
        matchedIndexes.push(new myMatch(myString[i], i));
    }
}

function myMatch(position, character) {
    this.position = position;
    this.character = character;
}

Résultat :

Fancy Result

Voici un violon en état de marche .

1voto

Pointy Points 172438
function dotsAndCommas(s) {
  var rv = [];
  for (var i = 0; i < s.length; ++i) {
    if (s[i] === '.' || s[i] === ',') rv.push(i);
  }
  return rv;
}

En résumé, faites-le. Il n'y a pas de raccourci que je puisse imaginer pour le faire avec une expression rationnelle.

1voto

Jeff B Points 20021

Ce n'est probablement pas l'idéal, mais à titre d'expérience, voici une façon de le faire avec des fonctions javascript intégrées (pas de boucles explicites) :

var pos = mystr.split(/[,.]/).slice(0,-1).map(function(val, i, a) { return a.slice(0, i+1).join('').length+i; });

Démonstration : http://jsfiddle.net/jtbowden/hHSB2/

Pour se débarrasser des .slice() qui est O(n^2) :

var pos = mystr.split(/[,.]/).slice(0,-1).map(function(val, i, a) { return a[i] = val.length+(a[i-1]||-1)+1; });

Démonstration : http://jsfiddle.net/jtbowden/hHSB2/1/

Et, oui, c'est toujours aussi laid et inutile.

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