Pregunta

Tengo una cadena que se ve algo como la siguiente 'prueba: 1; hola: cinco; simplemente: 23'. Con esta cadena que necesito para ser capaz de hacer lo siguiente.

....
var test = MergeTokens('test:1;hello:five;just:23', 'yes:23;test:567');
...

El resultado final debe ser 'prueba: 567; hola: cinco; simplemente: 23; sí: 23'. (Tenga en cuenta el orden exacto de las fichas no es tan importante)

Sólo me preguntaba si alguien tiene alguna idea inteligentes de cómo hacer esto. Estaba pensando en reemplazar una expresión regular en cada una de las fichas en la derecha y si un reemplazo no se produjo porque no había juego apenas lo añaden. Pero tal vez hay una mejor manera.

Saludos Anthony

Edit: El lado derecho debe anular la izquierda. La izquierda, siendo lo fue originalmente allí y siendo el lado derecho del nuevo contenido. Otra forma de ver las cosas, es que sólo mantiene las fichas de la izquierda si no existen a la derecha y se mantienen todas las fichas a la derecha.

@Ferdinand Gracias por la respuesta. El problema es la eficiencia con la que la solución que se propone. Estaba pensando inicialmente por líneas similares, pero descarté que debido a la O (n * z) complejidad de la combinación (donde n y Z es el número de fichas a la izquierda y derecha, respectivamente) por no hablar de la división y unión.

Por lo tanto, ¿por qué yo estaba tratando de mirar por el camino de una expresión regular. Tal vez detrás de las escenas, la expresión regular es igual de malo o peor, pero que tiene una expresión regular que permite eliminar el token de la cadena de izquierda que existe a la derecha (O (n) para la cantidad total de símbolo a la derecha) y luego simplemente añadir el 2 string juntos (es decir, cuba de test = test1 + test2) parece más eficiente. gracias

¿Fue útil?

Solución 2

Lo siguiente es lo que terminé pensando. ¿Qué es lo que ustedes Recon?

Gracias 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;

Otros consejos

Me gustaría utilizar join() y split() para crear algunas funciones de utilidad para empaquetar y desempaquetar los datos de contadores a un 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(';');
}

El uso de estos, la concentración es 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);
}

Las funciones de utilidad son también útiles si se desea extraer algunas claves (por ejemplo, "test") y / o detectar la existencia:

var data = splitTokens(str);
if (data["test"] === undefined) {
    // Does not exist
} else {
    alert("Value of 'test': " + data["test"]);
}

Soy un par de años de retraso, pero creo que esto es lo que busca:

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top