JavaScript 토큰 교체/추가
-
22-08-2019 - |
문제
다음 '테스트 : 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;
}