Domanda

Ho una stringa che sembra qualcosa di simile al seguente 'test: 1; ciao: cinque; basta: 23'. Con questa stringa ho bisogno di essere in grado di fare quanto segue.

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

Il risultato finale dovrebbe essere 'test: 567; ciao: cinque; basta: 23; sì: 23'. (Si noti l'ordine esatto dei gettoni non è così importante)

Chiedo solo se qualcuno ha qualche idea intelligente di come andare su questo. Stavo pensando una regex sostituire su ciascuno dei gettoni sulla destra e se un sostituirlo non si è verificato perché non c'era corrispondono solo aggiungerlo. Ma forse c'è modo migliore.

Saluti Anthony

Modifica: Il lato destro dovrebbe ignorare la sinistra. La sinistra essendo quello che era in origine e la parte destra è il nuovo contenuto. Un altro modo di vedere le cose, è che si mantiene solo i gettoni a sinistra, se non esistono sulla destra e si tengono tutti i gettoni sulla destra.

@Ferdinand Grazie per la risposta. Il problema è l'efficienza con cui la soluzione avete proposto. Stavo pensando inizialmente giù linee simili ma scontato che a causa della O (n * z) complessità della fusione (dove n e Z è il numero segnalini a destra rispettivamente a sinistra ea) e tanto meno la scissione e la giunzione.

Quindi perché stavo cercando di guardare dall'alto in basso il percorso di una regex. Forse dietro le quinte, regex è altrettanto male o peggio, ma con una regex che rimuove qualsiasi segnalino dalla stringa sinistra che esiste a destra (O (n) per l'importo totale del gettone a destra) e poi basta aggiungere il 2 stringa insieme (cioè vat test = test1 test2 +) sembra più efficiente. grazie

È stato utile?

Soluzione 2

Di seguito è quello che ho finito di pensare. Quello che voi ragazzi Recon?

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

Altri suggerimenti

Vorrei usare join() e split() per creare alcune funzioni di utilità per comprimere e decomprimere i dati token per un oggetto:

// 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(';');
}

L'utilizzo di questi, la fusione è semplice:

// 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);
}

Le funzioni di utilità sono utili anche se si desidera estrarre alcuni tasti (ad esempio, "test") e / o verificare l'esistenza:

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

Sono un paio di anni di ritardo, ma credo che questo è quello che stai cercando:

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top