2016-09-12 6 views
-1

文字と色を含む配列があります。色に文字の元のマッピングを維持しながら配列と文字列のマージ問題

const s = 'hey, howdy there';

const a = [ 
    {char: 'h', color: 'red'}, 
    {char: 'e', color: 'red'}, 
    {char: 'y', color: 'red'}, 
    {char: ' ', color: 'green'}, 
    {char: 't', color: 'red'}, 
    {char: 'h', color: 'red'}, 
    {char: 'e', color: 'red'}, 
    {char: 'r', color: 'red'}, 
    {char: 'e', color: 'red'} 
]; 

は、私は、文字列でこれをマージする機能を書きたいです。例えば、heythereを構成する文字は、元々は配列aに描かれているように、すべて赤色で、が緑色でなければならず、新しい文字はデフォルトでは何かに黄色で、古い文字はデフォルトで削除されます。

res = [ 
    {char: 'h', color: 'red'}, 
    {char: 'e', color: 'red'}, 
    {char: 'y', color: 'red'}, 
    {char: ',', color: 'yellow'}, 
    {char: ' ', color: 'green'}, 
    {char: 'h', color: 'yellow'}, 
    {char: 'o', color: 'yellow'}, 
    {char: 'w', color: 'yellow'}, 
    {char: 'd', color: 'yellow'}, 
    {char: 'y', color: 'yellow'}, 
    {char: ' ', color: 'yellow'}, 
    {char: 't', color: 'red'}, 
    {char: 'h', color: 'red'}, 
    {char: 'e', color: 'red'}, 
    {char: 'r', color: 'red'}, 
    {char: 'e', color: 'red'} 
]; 

一つのアプローチは、あなたが単語の配列を持っているので、const aから文字を抽出した空間上の文字列と分割にそれらに参加することがありますので、この関数の出力は私のような何かを与えるだろう。文字列sで繰り返します。元の配列と分割が一致しなくなるまで、新しい分割配列の文字列sをループします。それは, charで発生します。

ここで私はどのように進めるのか分かりません。単純なケースでは、2つの単語だけがある場合は、最初の単語を保持し、他のすべてを文字列の分割からの新しい単語に置き換えることができます。ただし、私が提供した場合、古い配列(there)の値を保持しながら、新しい文字列(つまり, howdy)に値を追加しています。

gitがテキストを比較するために使用するアルゴリズムはここではうまくいくと思いますが、それを複製する方法や、このユースケースでは効率的であるかどうかはわかりません。

編集: 私はその一部が矛盾していると分かったので少し修正しました。

+1

私はあなたが2つの文字列の編集の違いを判断する方法を研究する必要があると思います。それは '、howdy'が挿入されたことを伝えるべきで、あなたはそれを黄色でマークすることができます。 – Barmar

+0

私はあなたが何をしようとしているのか分かりません。問題は配列 'const a'を「マッピング」と呼んでいますが、配列として、順序を維持するためマッピング以上のものです。それには、「ちょっと」の「e」や「そこにある」のような重複した文字も含まれています。これらのキーの値はあなたの例では同じですが、時々異なる場合がありますか?真のマッピングは、 '{h:" red "、e:" red "...}'のようになり、順序はなくなり、重複するキーはありません。これを入出力として扱うアルゴリズムは非常に簡単です。それはあなたが欲しいものですか? – danh

+0

@Barmar編集の違いは、私が探していたものですが、説明する語彙がありませんでした。私はいくつかの研究を行い、マイヤーのdiffアルゴリズムは私が必要なものです。先端のおかげで! – nmac

答えて

0

どうやってこのようなことができますか?

https://jsfiddle.net/jdv9gz01/

function megaJoin (orig, newWord, index) { 
var tmpArr = orig.slice(); 
    var newWordArray = newWord.split('').map((char)=>{return {char:char, color:'yellow'}}); 
    Array.prototype.splice.apply(tmpArr, [index,0].concat(newWordArray)); 
    return tmpArr; 
} 

参加が起こるはずなので、私の機能は、私たちが参加すべき場所を知るためにインデックスを使用してどこがわからないでした。

newWordが何であるかわからない場合、この関数はそれを取得します。完璧ではありません。

function getDifference(weirdArray, newString) { 
    var tmps = []; 
    for (var i = 0; i <= weirdArray.length; i++) { 
     var word = a[i]; 
     if (word && word.char !== '' && i !== a.length) { 
      tmps.push(word.char); 
     } else { 
      newString = newString.replace(tmps.join(''), ''); 
      tmps = []; 
     } 
    } 
    return newString; 
} 
+0

newThingyがあらかじめわかっていない場合は、この機能はありますか?私の問題は、マージする2つの任意の文字列があり、古いものから新しいものへのマージに関する色情報を保持したいということです。 – nmac

+0

したがって、megaJoin関数では、newWordは常に文字列か、origと似た配列ですか? –

+0

newWordは常に文字列になりますが、フィドルではnewThingy constを使用して2つのものについて異なるものを手動で選択しています。もし私がすでにそれを持っていて、それがちょうどマッピングの問題だったなら、あなたの答えは十分ですが、問題は関数がnewThingyが何かを見つけることであり、私は手動ではありません。 – nmac