Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сравнение двух текстов (https://javascript.ru/forum/misc/40968-sravnenie-dvukh-tekstov.html)

devote 27.08.2013 16:43

function difference(a, b) {
    a = a.split(' ');
    b = b.split(' ');
    var d1 = a.filter(function(i) {return !(b.indexOf(i) > -1);});
    var d2 = b.filter(function(i) {return !(a.indexOf(i) > -1);});
    return d1.concat(d2);
}
alert(difference("Мама мыла очень кривую раму", "Мама долго мыла кривую раму"));

tsigel 27.08.2013 16:47

Началось, кто короче) Я только-только 1-й вариант прожевал)

Спасибо :)

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

С регулярками, увы, не дружу совсем. :(

devote 27.08.2013 17:01

function difference(a, b) {
    var re = /([~!$%^&*()_+|`\-=\\\[\]{};':",\.\/<>?@#])/g;
    a = a.replace(re, ' $1').split(' ');
    b = b.replace(re, ' $1').split(' ');
    var d1 = a.filter(function(i) {return !(b.indexOf(i) > -1);});
    var d2 = b.filter(function(i) {return !(a.indexOf(i) > -1);});
    return d1.concat(d2);
}
alert(difference("Мама! мыла очень кривую раму", "Мама? долго мыла кривую раму"));

tsigel 27.08.2013 17:05

devote,
Спасибо большое!

devote 27.08.2013 17:17

tsigel,
Обратите внимание indexOf и filter не доступны в IE до IE9.

devote 27.08.2013 17:19

вот полифил filter:
if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun /*, thisp*/) {
    'use strict';

    if (!this) {
      throw new TypeError();
    }

    var objects = Object(this);
    var len = objects.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }

    var res = [];
    var thisp = arguments[1];
    for (var i in objects) {
      if (objects.hasOwnProperty(i)) {
        if (fun.call(thisp, objects[i], i, objects)) {
          res.push(objects[i]);
        }
      }
    }

    return res;
  };
}

И соответственно indexOf:
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
    'use strict';
    if (this == null) {
      throw new TypeError();
    }
    var n, k, t = Object(this),
        len = t.length >>> 0;

    if (len === 0) {
      return -1;
    }
    n = 0;
    if (arguments.length > 1) {
      n = Number(arguments[1]);
      if (n != n) { // shortcut for verifying if it's NaN
        n = 0;
      } else if (n != 0 && n != Infinity && n != -Infinity) {
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
      }
    }
    if (n >= len) {
      return -1;
    }
    for (k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); k < len; k++) {
      if (k in t && t[k] === searchElement) {
        return k;
      }
    }
    return -1;
  };
}

Demath 27.08.2013 17:37

Цитата:

Сообщение от devote
вот полифил filter:
...

И соответственно indexOf:
...

Страшно :blink: , а вот преимущества в данном случае не очевидны (во всяком случае для меня).

Serg_pnz 27.08.2013 17:52

оффтоп: winmerge изобретаем, понятно...


Часовой пояс GMT +3, время: 09:00.