Javascript token de substituir / anexar
-
22-08-2019 - |
Pergunta
Eu tenho um string que se parece com o seguinte 'test: 1; Olá: cinco, basta: 23'. Com esta corda Eu preciso ser capaz de fazer o seguinte.
....
var test = MergeTokens('test:1;hello:five;just:23', 'yes:23;test:567');
...
O resultado final deve ser 'test: 567; Olá: cinco, basta: 23; sim: 23'. (Note a ordem exata das fichas não é tão importante)
Basta saber se alguém tiver alguma idéia inteligentes de como ir sobre isso. Eu estava pensando um regex substituir em cada uma das fichas em direito e se um substituir não ocorreu porque não havia corresponder apenas anexá-lo. Mas talvez não há melhor forma.
Felicidades Anthony
Edit: O lado direito deve substituir a esquerda. O ser esquerda o que era originalmente lá e do lado direito ser o novo conteúdo. Outra maneira de olhar para ele, é que você só manter os símbolos do lado esquerdo, se eles não existem no lado direito e você mantenha todas as fichas no lado direito.
@Ferdinand Obrigado pela resposta. O problema é a eficiência com que a solução que você propôs. I foi inicialmente pensando-se linhas semelhantes mas descontado devido ao O (N * z) complexidade da fusão (em que n e Z são os tokens número à esquerda e à direita, respectivamente) e muito menos a separação e união.
Daí porque eu estava tentando olhar para baixo o caminho de uma regex. Talvez nos bastidores, regex é tão ruim ou pior, mas ter uma regex que remove qualquer token da cadeia de esquerda que existe no direito (O (n) para a quantidade total de símbolo à direita) e, em seguida, basta adicionar o 2 encadear (isto é, teste de cuba = test1 teste2 +) parece ser mais eficiente. graças
Solução 2
O seguinte é o que eu acabei pensando. O que vocês Recon?
Graças Anthony
function Tokenizer(input, tokenSpacer, tokenValueSpacer) {
this.Tokenizer = {};
this.TokenSpacer = tokenSpacer;
this.TokenValueSpacer = tokenValueSpacer;
if (input) {
var TokenizerParts = input.split(this.TokenSpacer);
var i, nv;
for (i = 0; i < TokenizerParts.length; i++) {
nv = TokenizerParts[i].split(this.TokenValueSpacer);
this.Tokenizer[nv[0]] = nv[1];
}
}
}
Tokenizer.prototype.add = function(name, value) {
if (arguments.length == 1 && arguments[0].constructor == Object) {
this.addMany(arguments[0]);
return;
}
this.Tokenizer[name] = value;
}
Tokenizer.prototype.addMany = function(newValues) {
for (nv in newValues) {
this.Tokenizer[nv] = newValues[nv];
}
}
Tokenizer.prototype.remove = function(name) {
if (arguments.length == 1 && arguments[0].constructor == Array) {
this.removeMany(arguments[0]);
return;
}
delete this.Tokenizer[name];
}
Tokenizer.prototype.removeMany = function(deleteNames) {
var i;
for (i = 0; i < deleteNames.length; i++) {
delete this.Tokenizer[deleteNames[i]];
}
}
Tokenizer.prototype.MergeTokenizers = function(newTokenizer) {
this.addMany(newTokenizer.Tokenizer);
}
Tokenizer.prototype.getTokenString = function() {
var nv, q = [];
for (nv in this.Tokenizer) {
q[q.length] = nv + this.TokenValueSpacer + this.Tokenizer[nv];
}
return q.join(this.TokenSpacer);
}
Tokenizer.prototype.toString = Tokenizer.prototype.getTokenString;
Outras dicas
Gostaria de usar join()
e split()
para criar algumas funções utilitárias para embalar e desembalar os seus dados token para um objeto:
// Unpacks a token string into an object.
function splitTokens(str) {
var data = {}, pairs = str.split(';');
for (var i = 0; i < pairs.length; ++i) {
var pair = pairs[i].split(':');
data[pair[0]] = pair[1];
}
return data;
}
// Packs an object into a token string.
function joinTokens(data) {
var pairs = [];
for (var key in data) {
pairs.push(key + ":" + data[key]);
}
return pairs.join(';');
}
Usando estes, a fusão é fácil:
// Merges all token strings (supports a variable number of arguments).
function mergeTokens() {
var data = {};
for (var i = 0; i < arguments.length; ++i) {
var d = splitTokens(arguments[i]);
for (var key in d) {
data[key] = d[key];
}
}
return joinTokens(data);
}
As funções de utilidade também são úteis se você deseja extrair algumas teclas (por exemplo, "teste") e / ou verificação da existência:
var data = splitTokens(str);
if (data["test"] === undefined) {
// Does not exist
} else {
alert("Value of 'test': " + data["test"]);
}
i am alguns anos de atraso, mas eu acho que isso é o que você está procurando:
function MergeTokens(input, replace){
var replaceTokens = replace.split(";");
for(i=0; i<replaceTokens.length; i++){
var pair = replaceTokens[i].split(":");
var result = input;
regString = "\\b" + pair[0] + ":[\\w]*\\b";
var reg = new RegExp(regString);
if(reg.test(result)){
result = result.replace(reg, replaceTokens[i]);
}
else{
result = result + replaceTokens[i];
}
}
return result;
}