Javascript токен заменить / добавить - PullRequest
1 голос
/ 29 марта 2009

У меня есть строка, которая выглядит примерно так: 'test: 1; hello: five; just: 23'. С этой строкой мне нужно сделать следующее.

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

Конечным результатом должно быть 'test: 567; привет: пять; просто: 23; да: 23' (обратите внимание, точный порядок токенов не так важен).

Просто интересно, есть ли у кого-нибудь умные идеи, как это сделать. Я думал, что регулярное выражение заменяет каждый из жетонов справа, и если замена не произошла из-за несоответствия, просто добавьте его. Но, может быть, есть лучший способ.

Приветствие Anthony

Редактировать: правая сторона должна перекрывать левую. Слева - то, что было изначально, а справа - новый контент. Другой способ взглянуть на это состоит в том, что вы держите токены слева только в том случае, если они не существуют справа, а все токены справа.

@ Ferdinand Спасибо за ответ. Проблема в том, насколько эффективно предложенное вами решение. Первоначально я размышлял над подобными строками, но обесценил это из-за сложности слияния O (n * z) (где n и z - число токенов слева и справа соответственно), не говоря уже о расщеплении и объединении.

Следовательно, почему я пытался смотреть вниз по пути регулярных выражений. Может быть, негласно, регулярное выражение так же плохо или хуже, но имеет регулярное выражение, которое удаляет любой токен из левой строки, которая существует справа (O (n) для общего количества токена справа), а затем просто добавляет 2 строки вместе (т.е. тест vat = test1 + test2) кажется более эффективным. спасибо

Ответы [ 3 ]

6 голосов
/ 29 марта 2009

Я бы использовал join() и split() для создания некоторых служебных функций для упаковки и распаковки данных вашего токена в объект:

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

Используя их, объединить легко:

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

Функции утилиты также полезны, если вы хотите извлечь некоторые ключи (скажем, «test») и / или проверить наличие:

var data = splitTokens(str);
if (data["test"] === undefined) {
    // Does not exist
} else {
    alert("Value of 'test': " + data["test"]);
}
0 голосов
/ 05 октября 2010

Я опоздал на несколько лет, но думаю, это то, что вы ищете:

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;
}
0 голосов
/ 30 марта 2009

Вот что я закончил думать. Что вы, ребята, восстанавливаете?

Спасибо Энтони

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