当前位置:  开发笔记 > 编程语言 > 正文

Javascript标记替换/追加

如何解决《Javascript标记替换/追加》经验,为你挑选了1个好方法。

我有一个类似于以下'test:1; hello:five; just:23'的字符串.有了这个字符串,我需要能够做到以下几点.

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

最终结果应为'test:567; hello:five; just:23; yes:23'(注意令牌的确切顺序并不重要).

只是想知道是否有人对如何解决这个问题有任何明智的想法.我正在考虑在右边的每个令牌上使用正则表达式替换,如果由于没有匹配而没有发生替换只是附加它.但也许有更好的方法.

干杯安东尼

编辑:右侧应覆盖左侧.左边是原来的,右边是新内容.另一种看待它的方法是,如果右侧不存在令牌,则只保留左侧的令牌,并将所有令牌保持在右侧.

@Ferdinand 感谢您的回复.问题是您提出的解决方案的效率.我最初考虑类似的行,但由于合并的O(n*z)复杂性而打折扣(其中n和z分别是左右分别的数字标记),更不用说拆分和连接了.

因此,为什么我试图俯视正则表达式的路径.也许在幕后,正则表达式同样糟糕或更糟,但有一个正则表达式从右侧存在的左侧字符串中删除任何标记(右侧令牌总数为O(n))然后只需添加2个字符串在一起(即增值测试= test1 + test2)似乎更有效.谢谢



1> Ferdinand Be..:

我将使用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"]);
}

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有