2016-06-23 5 views
1

これはJavaScript専用です。複数の置換えが定義済みのインデックス

は、私が"cat dog cat"、文字列を持っている、と私は"1 2 1"で、その結果、"2""1"と文字4-6で文字0-2と8-10の両方を交換する必要がありますと言います。

私だけ交換する私が持っているものの範囲を知っている- 私にはわからない、その内容

は私がして、各範囲を交換する必要が知っている、と私は範囲がそもそも知っているが、もし最初の範囲を置き換え、他のすべての位置がシフトしました。これは、それ以上の置換が間違ったインデックスに影響することを意味します。

この交換を正しく行うにはどうすればよいですか?

答えて

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

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" 
関連する問題