2016-09-12 2 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를 원래의 배열과의 불일치가 생길 때까지 반복하십시오. 그 문자는 ,에 발생합니다.

여기서 어떻게 진행해야할지 모르겠습니다. 두 단어 만있는 간단한 경우에는 첫 번째 단어를 유지하고 다른 모든 단어를 문자열 s split의 새 단어로 바꿀 수 있습니다. 그러나 제공 한 경우 이전 배열 (there)의 값을 유지하면서 새 문자열 (예 : , howdy)에 값을 추가합니다.

git이 텍스트를 diff하는 데 사용하는 알고리즘은 여기에서 작동하지만 상상해보십시오. 그러나 정확히 어떻게 복제하는지 또는이 사용 사례에서 효율적 일지는 모르겠습니다.

편집 : 일부 내용이 일치하지 않아 약간 수정되었습니다.

+1

두 문자열 간의 편집 차이를 확인하는 방법을 연구해야한다고 생각합니다. 그건', howdy'가 삽입되었다는 것을 알려주고, 노란색으로 표시 할 수 있습니다. – Barmar

+0

나는 당신이 무슨 일을하는지 잘 모르겠다. 질문은 배열'const a'를 "매핑"이라고 부릅니다. 그러나 배열로서, 그것은 순서를 유지하기 때문에 매핑 이상의 것입니다. 그것은 또한 'hey'의 'e'와 'there'의 'e'와 같은 중복 된 문자를 포함합니다. 귀하의 예에서 이러한 키의 값은 같지만 때로는 다를 수 있습니까? 진정한 매핑은'{h : "red", e : "red"...}와 같이 보이며 순서는없고 중복 키는 없을 것입니다. 이것을 입출력으로 처리하는 알고리즘은 매우 간단합니다. 너가 원하는게 그거야? – danh

+0

@Barmar 편집상의 차이점은 내가 찾고있는 것이지만 설명 할 어휘가 없다. 나는 연구를했고 myer의 diff 알고리즘은 내가 필요로하는 것이다. 팁 고마워! – nmac

답변

0

어때?

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

https://jsfiddle.net/jdv9gz01/

나는 우리가 참여해야하는 위치 나의 기능을 알고 인덱스를 사용, 여기서 발생해야 참여 확신 할 수 없었다.

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가 미리 무엇인지 모르는 경우이 방법이 효과가 있습니까? 내 문제는 병합 할 임의의 두 문자열이 있고 이전에서 새 병합에 대한 색 정보를 유지하려는 것입니다. – nmac

+0

그래서 megaJoin 함수에서 newWord는 항상 문자열이 될 것인가 아니면 orig와 비슷한 배열일까요? –

+0

newWord는 항상 문자열이지만 피들에서는 newThingy const를 통해 두 항목에 대해 다른 것을 수동으로 선택했습니다. 만약 내가 이미 그것을 가지고 있고 단지 매핑의 문제 였다면, 당신의 대답은 충분 하겠지만, 문제는 함수가 수동적이 아닌 newThingy가 무엇인지 찾아야한다는 것입니다. – nmac