Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 27.08.2013, 15:19
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

var text1 = "Мама мыла очень кривую раму";
var text2 = "Мама долго мыла кривую раму";
        var arr1 = text1.split(' ');
        var arr2 = text2.split(' ');

        var result1 = [], result2 = [];

        for (var i = 0; i < arr1.length; i++) {

            if (arr2[i] == undefined) {

                for (var j = i; j < arr1.length; j++) {
                    arr1[j] = "<span class='changedText'>" + arr1[j] + "</span>";
                }
                break;

            }

            if (arr1[i] != arr2[i]) {

                if (findInArray(arr1[i], arr2)) {

                    arr1.splice(i, 0, arr1[i]);
                    arr2[i] = "<span class='changedText'>" + arr2[i] + "</span>";

                    if (result1[result1.length - 1] != arr1[i])
                        result1.push(arr1[i]);

                    result2.push(arr2[i]);
                } else {

                    arr2.splice(i, 0, arr2[i]);
                    arr1[i] = "<span class='changedText'>" + arr1[i] + "</span>";
                    result1.push(arr1[i]);
                }

            } else {
                if (result1[result1.length - 1] != arr1[i])
                    result1.push(arr1[i]);
                result2.push(arr2[i]);
            }
        }

        function findInArray (element, array) {
            var find = false;

            for (var i = 0; i < array.length; i++) {
                if (array[i] == element)
                    find = true;
            }

            return find;
        }

alert(result1.join(' '));
alert(result2.join(' '));


Вроде работает, но есть косяки:

Не придумал что делать если новый текст длиннее исходного (я пробегаюсь только по исходному массиву).

keen,
Как Вы и говорили косяки со знаками препинания. Вроде это можно сделать регулярными выражениями, но в них я не силен, как бы мне выделить в отдельные элементы массива знаки препинания так, чтобы потом оно нормально склеилось в строку и не потерять при этом знаки?

И ещё, мой алгоритм не выводит в первом массиве 2 одинаковых слова

Последний раз редактировалось tsigel, 27.08.2013 в 16:13.
Ответить с цитированием
  #12 (permalink)  
Старый 27.08.2013, 15:49
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от tsigel
И ещё, мой алгоритм не выводит в первом массиве 2 одинаковых слова
А, вообще, почему из первого массива должно что-то выводится?

____________

Сообщение от tsigel
Есть 2 текста, по идее эти тексты должны не сильно отличаться друг от друга. Задача найти изменения в этом тексте и выделить цветом.
"в этом тексте" - в каком именно: в 1-ом или 2-ом или в обоих сразу?

Приведите примеры.

Последний раз редактировалось Demath, 27.08.2013 в 15:52.
Ответить с цитированием
  #13 (permalink)  
Старый 27.08.2013, 15:52
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Не совсем. На странице представлены 2 версии документа. text1 текст данного поля из более старой версии, text2 - соответственно более новой. Необходимо цветом выделить изменения в обоих документах. И в старом и в новом. Чтобы оператор при работе с ними не искал читая одинаковые документы.
Ответить с цитированием
  #14 (permalink)  
Старый 27.08.2013, 15:54
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

У документов есть поля для редактирования, так что функция не должна быть рассчитана на обработку больших количеств текста за 1 заход.

Оптимизация и скорость работы тоже не волнует, т.к. Функция запускается однократно при загрузке страницы.
Ответить с цитированием
  #15 (permalink)  
Старый 27.08.2013, 15:59
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Например, для

var text1 = "Мама мыла очень кривую раму";
var text2 = "Мама долго мыла кривую раму";

какие слова нужно вывести?
Ответить с цитированием
  #16 (permalink)  
Старый 27.08.2013, 16:07
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Demath,
Для данных текстов:
text1 = "Мама мыла <span class='changedText'>очень</span> кривую раму"
text2 = "Мама <span class='changedText'>долго</span> мыла кривую раму"


И из первого исчезло "очень", мы его выделяем, а во втором добавилось "долго", его мы тоже выделяем.

Удивительно, но скрипт выше правильно отрабатывает данные тексты

По идее, если бы тексты были такие:
var text1 = "Мама мыла кривую раму";
var text2 = "Мама мыла раму";

То необходимо было бы в первом тексте выделить "кривую", а второй оставить неизменным.

Последний раз редактировалось tsigel, 27.08.2013 в 16:14.
Ответить с цитированием
  #17 (permalink)  
Старый 27.08.2013, 16:23
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от Demath
Сообщение от tsigel
И ещё, мой алгоритм не выводит в первом массиве 2 одинаковых слова
А, вообще, почему из первого массива должно что-то выводится?
Есть документ, пользователь может посмотреть изменения этого документа. При просмотре у него на экране 2 версии одного документа, слева старая, справа - новая.

Сообщение от Demath
Сообщение от tsigel
Есть 2 текста, по идее эти тексты должны не сильно отличаться друг от друга. Задача найти изменения в этом тексте и выделить цветом.
"в этом тексте" - в каком именно: в 1-ом или 2-ом или в обоих сразу?
Изменения надо подсвечивать в 2х документах.
Ответить с цитированием
  #18 (permalink)  
Старый 27.08.2013, 16:24
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Прошу прощения если непонятно объясняю.
Ответить с цитированием
  #19 (permalink)  
Старый 27.08.2013, 16:26
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Почитайте перед сном симметрическая разность


function DiffArrays(A,B)
{
    var M = A.length, N = B.length, C = [];
    for (var i=0; i<M; i++)
     { var j = 0;
       while (B[j]!==A[i] && j<N) j++;
       if (j==N) C[C.length] = A[i];
     }
   return C;
}

function SymmDiffArrays(A,B)
{
   return DiffArrays(A,B).concat( DiffArrays(B,A) );
}
 
var text1 = "Мама мыла очень кривую раму",
    text2 = "Мама долго мыла кривую раму",
    arr1 = text1.split(' '),
    arr2 = text2.split(' ');
 
alert( SymmDiffArrays(arr1, arr2) );
Ответить с цитированием
  #20 (permalink)  
Старый 27.08.2013, 16:30
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Demath,
Спасибо за ответ, учу матчасть!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пересечение и разность двух массивов harold Общие вопросы Javascript 9 18.12.2013 21:41
как сделдать меню из двух калонок как в bestchange.ru Андрей Лебедев Элементы интерфейса 2 21.01.2013 10:32
Сравнение двух дат fAmOus Элементы интерфейса 1 21.08.2012 16:27
Сравнение двух строк drac0Sha Общие вопросы Javascript 17 20.08.2012 19:45
MySQl дата между двух дат mycoding Серверные языки и технологии 8 14.02.2011 15:23