2013-02-05 3 views
1

similaires à String split & join, mais pour Javascript:chaîne Echappé diviser et rejoindre

J'ai un tableau de chaînes. Je dois être en mesure de joindre les éléments dans une chaîne et ensuite diviser cette chaîne à nouveau pour obtenir la collection de chaînes d'origine. Cependant, chaque chaîne peut contenir la chaîne de jointure, donc je vais devoir faire un peu d'échappement. Y a-t-il des recettes sur comment y parvenir?

Voici un exemple:

serialized = ["Hello", ",", "World"].join(",") # Nice would be "Hello,\,,World" 

Mais

serialized.split(",") 

retours ["Hello", "", "", "World"] au lieu de ["Hello", ",", "World"]

+1

OK, je suis curieux. * Pourquoi * joignez-vous une chaîne, puis divisez-la? On dirait que vous avez besoin d'autre chose! –

+0

Le comportement ci-dessus est correct puisque vous vous joignez à la virgule et la virgule est aussi celle des chaînes jointes ... – marekful

+0

En effet, le but est "jolie" sérialisation. Je voudrais garder tout ce que la jointure et la scission font, sauf pour permettre aux chaînes de contenir le caractère de jonction comme illustré. – rumpel

Répondre

1

Le faire manuellement Je suis venu avec cela, en cas n'importe qui jamais trébuche sur ceci encore;)

splitAndUnescape = function(character, str, opt_escapeChar) { 
    var result = []; 
    var escapeChar = opt_escapeChar || '\\'; 
    var tmp = ''; 
    for (var index = 0; index < str.length; index++) { 
    var ch = str.charAt(index); 
    if (ch == escapeChar) { 
     ch = str.charAt(++index); 
    } else if (ch == character) { 
     result.push(tmp); 
     tmp = ''; 
     continue; 
    } 
    tmp += ch; 
    } 
    if (tmp || result.length) { 
    result.push(tmp); 
    } 
    return result; 
}; 

escapeAndJoin = function(character, array, opt_escapeChar) { 
    var escapeChar = opt_escapeChar || '\\'; 
    var reEscape = new RegExp('(\\' + character + '|\\' + escapeChar + ')', 'g'); 
    var out = []; 
    for (var index = 0; index < array.length; index++) { 
    out.push(array[index].replace(reEscape, escapeChar + '$1')); 
    } 
    return out.join(character); 
}; 

PoC:

serialized = escapeAndJoin(",", ["Hello", ",", "World"]); # -> "Hello,\,,World" 
splitAndUnescape(",", serialized) # -> ["Hello", ",", "World"] 
+0

Je pensais juste que l'API serait plus conviviale comme 'Array.prototype.escapedJoin' et' String.prototype.escapedSplit'. –

2

Vous pouvez utiliser JSON.stringify() et JSON.parse() à la place.

JSON.stringify(["Hello", ",", "World"]) // -> '["Hello",",","World"]' 
JSON.parse('["Hello",",","World"]') // -> ["Hello", ",", "World"] 
+1

Méfiez-vous, JSON dépend du navigateur ... Vous aurez besoin d'un lien de script spécifique pour le vieux IE – solisoft

+0

Bien que cela fonctionne évidemment très bien, une exigence supplémentaire est que la chaîne doit être "sympa", c'est-à-dire ne pas contenir trop de passe-partout. Je vais mettre dans une URL et je veux éviter les choses% .. échappées). – rumpel

+0

@solisoft ce droit merci de le mentionner. Internet Explorer 8+, Firefox 3.1+, Safari 4+, Chrome 3+ et Opera 10.5+ prennent en charge l'analyse JSON native. –

0

Utilisez un caractère spécifique (ou une phrase) pour joindre et scinder.

Par exemple:

["Hello", "," ,"World"].join("*$%").split("*$%") 

retournera:

["Hello", "," ,"World"] 

Il suffit de ne pas utiliser un caractère commun à partager & rejoindre