2017-09-06 1 views
3

str1 d'entrée donné est "abc" et STR2 "def" sortie doit être adbecf et donné str1 = "ab" et str2 = sortie "def" devrait être adbefComment fusionner deux chaînes alternativement en javascript?

ma sortie a été:

fusion ('abc', 'def') "adbecfNaN"

fusion ('ab', 'def') "adbeundefinedf"

je tente de filtrer non défini et NAN, mais cela ne fonctionne pas .

Voici mon code:

function merge (str1, str2) { 

    var a = str1.split("").filter(Boolean); 

    var b = str2.split(""); 

    var mergedString = ''; 


    for(var i = 0; i <= a.length && i <= b.length; i++) { 

     mergedString += a[i] + b[i]; 

    } 

    return mergedString; 

} 
+0

'a [i]' est '' undefined' lorsque i == a.length'; vous voulez 'i

Répondre

1

vous devez utiliser < et non <= dans un état de boucle puisque les indices de tableau sont démarrés de 0. C'est la raison pour laquelle vous obtenez NaN. vous pouvez faire quelque chose comme ceci:

function merge (str1, str2) { 
 

 
    var a = str1.split("").filter(Boolean); 
 

 
    var b = str2.split(""); 
 

 
    var mergedString = ''; 
 

 

 
    for(var i = 0; i < a.length || i < b.length; i++) { //loop condition checks if i is less than a.length or b.length 
 
    if(i < a.length) //if i is less than a.length add a[i] to string first. 
 
    mergedString += a[i]; 
 
    if(i < b.length) //if i is less than b.length add b[i] to string. 
 
    mergedString += b[i]; 
 
    } 
 
return mergedString; 
 

 
} 
 
console.log(merge('abc','def')); 
 
console.log(merge('ab','def'));

0

Une ligne à ES6: choisir la plus grande chaîne, deux dessus et rejoindre:

var a = "ab", b = "def" 

Array.from(a.length > b.length ? a : b) 
    .map((_, i) => (a[i] || "") + (b[i] || "")) 
    .join() 
0

JS lien bin - https://jsbin.com/nihoxivoxa/edit?js,console

function merge (str1, str2) { 
 

 
    var a = str1.split(""); 
 

 
    var b = str2.split(""); 
 
    
 
    var count = 0; 
 
    
 
    var merged_string = ""; 
 
    //let's determine the loop counts, which depends on the smaller length of string 
 
    
 
    a.length < b.length ? count = a.length: count = b.length; 
 
    
 
    
 
    for(var i=0; i< count; i++){ 
 
    merged_string += a[i]+b[i]; 
 
    
 
    } 
 
    
 
    // add remaining characters 
 

 
    count < str1.length 
 
    ? merged_string += str1.substr(count, str1.length) 
 
    : merged_string += str2.substr(count, str2.length) 
 

 
    
 
    return merged_string; 
 

 
    
 
} 
 
console.log(merge('ab','xysfergtrhyhn'))

0
function merge(s1, s2) { 
    var result = ""; 
    for(var i=0; i<s1.length && i<s2.length; i++){ 
    result+=s1[i]+s2[i]; 
    } 
s1.length<s2.length?result+=s2.substr(s1.length):result+=s1.substr(s2.length) 
return result; 
} 
console.log(merge("abc","12345")); 
console.log(merge("12345","abc")); 
1

Le chemin le plus court et probablement le plus rapide, est de la plus petite longueur itérer de la chaîne, puis prendre le reste des deux cordes.

function zip(a, b) { 
 
    var i, 
 
     l = Math.min(a.length, b.length), 
 
     temp = ''; 
 

 
    for(i = 0; i < l; i++) { 
 
     temp += a[i] + b[i]; 
 
    } 
 
    return temp + a.slice(i) + b.slice(i); 
 
} 
 

 
console.log(zip('abc', '123')); // a1b2c3 
 
console.log(zip('ab', '123')); // a1b23 
 
console.log(zip('abcd', '12')); // a1b2cd

Avec ES6, vous pouvez utiliser Array.from avec le construit en mappeur pour les lettres.

var a = "ab", 
 
    b = "def", 
 
    result = Array.from(a.length > b.length ? a : b, (_, i) => (a[i] || "") + (b[i] || "")) 
 
        .join(''); 
 

 
console.log(result);

0

Si vous convertissez les chaînes de tableaux, vous pouvez récursive déplacer le premier élément hors de chaque réseau sur un nouveau tableau, puis continuer jusqu'à ce qu'il n'y a pas d'éléments laissés dans les deux tableaux, enfin renvoyer le nouveau tableau.

const shift = (a, b) => a.length||b.length?[a.shift(), b.shift(), ...shift(a,b)]:[]; 
 

 
console.log(shift([...'acegik'],[...'bdfhjl']).join('')); // abcdefghijkl 
 
console.log(shift([...'aceg' ],[...'bdfhjl']).join('')); // abcdefghjl 
 
console.log(shift([...'acegik'],[...'bdfh' ]).join('')); // abcdefghik

0

Une approche simple: itérer sur la plus longue chaîne, sortie la combinaison des caractères à l'indice actuel, utilisez la chaîne vide si aucun caractère existe à l'indice actuel.

console.log(merge('ab','def')); 
 

 
function merge(a, b){ 
 
    for(var i = 0, s = '', l = Math.max(a.length, b.length); i < l; i++){ 
 
    s += a.charAt(i) || ''; 
 
    s += b.charAt(i) || ''; 
 
    } 
 
    return s; 
 
}