2010-10-26 9 views
3

j'ai les suivantes chaînes générées dynamiquement:Javascript combiner des tableaux ou des chaînes

var stringA = ["a1", "a2", "a3" ... 'a400' ... 'a600']; // length 600 
var stringB = ["b1", "b2", "b3" ... 'b400']; // length 400 

Comment puis-je obtenir un tableau ou une chaîne de deux combinés comme ceci:

var myString = ["a1b1", "a2b2", "a3b3" ... "a400b400", "a401" ... "a600"] 

Répondre

3

Vous pouvez faire quelque chose comme ceci:

var result = [], len = Math.max(stringA.length, stringB.length); 
for(var i=0; i < len; i++) { 
    result.push((stringA[i] || "") + (stringB[i] || "")); 
} 

You can test it out here, le || "" est d'empêcher d'obtenir undefined comme une chaîne sur la pour le tableau qui est plus courte. L'appel Math.max() est de permettre soitA ou B d'être plus long, il va itérer à la fin de l'un ou l'autre, tout comme A est plus long dans la question.

+0

J'ai supprimé ma réponse parce que j'ai oublié que je * devrais utiliser 'Math.max()' pour éviter de parcourir un plus petit tableau. Donc +1 à toi Nick! – alex

+0

Merci Nick! Tu m'as encore aidé! – Mircea

+0

Cela aboutira à des entrées dans le tableau de destination aux index où il n'y a pas d'entrées dans l'un ou l'autre des tableaux sources (s'il existe de telles entrées). –

0

Je ne pense pas qu'il y ait quelque chose construit dans l'objet Array qui le fera pour vous, vous devrez faire la boucle. La boucle est trivial, si:

var index, length; 
var result = []; 
// assertion: arrayA.length === arrayB.length 
result.length = arrayA.length; // Helps performance in some implemenations, harmless in others 
for (index = 0, length = arrayA.length; index < length; ++index) { 
    result[index] = arrayA[index] + arrayB[index]; 
} 

(j'ai rebaptisés stringA ->arrayA et stringB ->arrayB pour éviter toute confusion.)

Si les tableaux sont différentes longueurs ou certaines des entrées dans les tableaux ne sont pas définis (ce qui est tout à fait possible, des tableaux JavaScript sont rares), vous voulez gérer que dans la boucle, par exemple:

var index, length, Apresent, Bpresent; 
var result = []; 
result.length = Math.max(arrayA.length, arrayB.length); // Helps performance in some implementations, harmless in others 
for (index = 0, length = result.length; index < length; ++index) { 
    Apresent = arrayA.hasOwnProperty(index); 
    Bpresent = arrayB.hasOwnProperty(index); 
    if (Apresent && Bpresent) { 
     result[index] = arrayA[index] + arrayB[index]; 
    } 
    else if (Apresent) { 
     result[index] = arrayA[index]; 
    } 
    else if (Bpresent) { 
     result[index] = arrayB[index]; 
    } 
} 

Si l'ar les rayons sont clairsemés et ils sont tous les deux rares dans le même index, le tableau résultant sera également épars.

+0

Cela se traduira également par beaucoup de 'undefined' lorsque les longueurs de tableau diffèrent, comme ils le font dans la question :) –

+0

@ Nick: Merci. Il n'était pas du tout clair d'après la question à l'origine que les tableaux pouvaient être de différentes longueurs (il les a montrés comme la même longueur), mais je vois ce que vous voulez dire dans son exemple de résultat (subtil, ça). J'ai vu votre autre commentaire et mis à jour comme vous l'avez commenté ici. :-) Je vois que quelqu'un a fixé la question pour lui. –

-1
var myString = []; 

for (var i=0;i<stringA.length;i++){ 
    myString[i] = stringA[i] + stringB[i]; 
} 
+0

Cela ne fonctionnera pas, vous obtiendrez '' undefined ''dans beaucoup d'endroits quand les longueurs de tableau diffèrent, comme dans la question. –

0

Si vous n'avez pas besoin de conserver les éléments dans les deux matrices d'origine, le code ci-dessous fonctionne très bien. Il n'a pas de limite prédéterminée au nombre d'itérations dans la boucle for, ce qui signifie que le tableau stringA et StringB pourrait continuer à croître en taille pendant que ce code est en cours d'exécution.

var myString = []; 
for(var answer; answer = (stringA.shift() || "") + (stringB.shift() || "");) { 
    myString.push(answer); 
} 
Questions connexes