문제

다음 '테스트 : 1; hello : 5; Just : 23'과 같은 것처럼 보이는 문자열이 있습니다. 이 문자열을 사용하면 다음을 수행 할 수 있어야합니다.

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

최종 결과는 '테스트 : 567; hello : 5; 단지 23; 예 : 23'이어야합니다 (토큰의 정확한 순서는 그다지 중요하지 않습니다).

누구 든지이 문제를 해결하는 방법에 대한 현명한 아이디어가 있는지 궁금합니다. 나는 오른쪽에있는 각 토큰에 Regex 교체를 생각하고 있었고, 일치하지 않기 때문에 교체가 발생하지 않으면 그것을 추가하십시오. 그러나 아마도 더 좋은 방법이있을 것입니다.

Anthony를 건배합니다

편집 : 오른쪽은 왼쪽을 무시해야합니다. 왼쪽은 원래 존재했던 것과 오른쪽은 새로운 콘텐츠입니다. 그것을 보는 또 다른 방법은 오른쪽에 존재하지 않는 경우 왼쪽에 토큰을 유지하고 모든 토큰을 오른쪽에 보관한다는 것입니다.

@ferdinand답장을 보내 주셔서 감사합니다. 문제는 귀하가 제안한 솔루션의 효율성입니다. 나는 처음에 비슷한 선을 생각했지만 합병의 O (n*z) 복잡성 (여기서 n과 z는 각각 왼쪽과 오른쪽의 숫자 토큰)으로 인해 할인했다.

그래서 왜 내가 regex의 길을 내려다 보려고했던 이유. 아마도 무대 뒤에서 Regex는 나쁘거나 나쁘지만 오른쪽에 존재하는 왼쪽 문자열에서 토큰을 제거하는 REGEX가있는 다음 (오른쪽의 총 토큰 금액에 대해 O (N))를 추가 한 다음 추가합니다. 2 String Together (예 : VAT TEST = TEST1 + TEST2)가 더 효율적인 것 같습니다. 감사해요

도움이 되었습니까?

해결책 2

다음은 내가 Thiking을 끝내는 것입니다. 너희들은 무엇을 반복합니까?

감사합니다 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;

다른 팁

나는 사용할 것이다 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);
}

유틸리티 기능은 키 ( "테스트")를 추출하거나 존재를 확인하려는 경우 유용합니다.

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

나는 몇 년 늦었지만 이것이 당신이 찾고있는 것 같아요.

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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top