多个替换为预定义的索引

时间:2016-06-23 19:21:06

标签: javascript string replace

这是专门针对JavaScript的。

假设我有一个字符串"cat dog cat",我必须用"1"替换字符0-2和8-10,用"2"替换字符4-6,结果为{{ 1}}。

知道我要替换的范围 - 我不知道他们的内容

我知道我要用什么替换每个范围,我知道开始的范围,但是如果我替换第一个范围,其他一切的位置都会发生变化,这意味着任何进一步的替换都会影响错误的索引。

我如何正确地进行更换?

2 个答案:

答案 0 :(得分:1)

您可以使用Array#reduce并迭代所有字符,并决定是否替换,删除或使用该字符。



var string ="cat dog cat",
    replace = [{ value: '1', from: 0, to: 2 }, { value: '1', from: 8, to: 10 }, { value: '2', from: 4, to: 6 }],
    result = string.split('').reduce(function (r, a, i) {
        return replace.some(function (b) {
            if (i >= b.from && i <= b.to) {
                if (i === b.from) {
                    r += b.value;
                }
                return true;
            }
        }) ? r : r + a;
    }, '');

console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用临时“存根”(null值)来保留初始位置并使用Array.splice函数进行所需的插入:

var str = "cat dog cat", chars = str.split(""),
    // predefined ranges (v - replacing value, r - range of positions)
    ranges = [{v: 1, r: [0,2]}, {v: 2, r: [4,6]}, {v: 1, r: [8,10]}];

ranges.forEach(function(o){
    chars.splice(o.r[0], (o.r[1] - o.r[0]) + 1); // removing elements starting from specified index
    chars.splice(o.r[0], 0, o.v, null, null); // filling with stubs
});
chars = chars.filter(function(v){ return v !== null; }).join("");

console.log(chars);  // "1 2 1"