文字と色を含む配列があります。色に文字の元のマッピングを維持しながら配列と文字列のマージ問題
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'}
];
は、私は、文字列でこれをマージする機能を書きたいです。例えば、hey
とthere
を構成する文字は、元々は配列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がテキストを比較するために使用するアルゴリズムはここではうまくいくと思いますが、それを複製する方法や、このユースケースでは効率的であるかどうかはわかりません。
編集: 私はその一部が矛盾していると分かったので少し修正しました。
私はあなたが2つの文字列の編集の違いを判断する方法を研究する必要があると思います。それは '、howdy'が挿入されたことを伝えるべきで、あなたはそれを黄色でマークすることができます。 – Barmar
私はあなたが何をしようとしているのか分かりません。問題は配列 'const a'を「マッピング」と呼んでいますが、配列として、順序を維持するためマッピング以上のものです。それには、「ちょっと」の「e」や「そこにある」のような重複した文字も含まれています。これらのキーの値はあなたの例では同じですが、時々異なる場合がありますか?真のマッピングは、 '{h:" red "、e:" red "...}'のようになり、順序はなくなり、重複するキーはありません。これを入出力として扱うアルゴリズムは非常に簡単です。それはあなたが欲しいものですか? – danh
@Barmar編集の違いは、私が探していたものですが、説明する語彙がありませんでした。私はいくつかの研究を行い、マイヤーのdiffアルゴリズムは私が必要なものです。先端のおかげで! – nmac