Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как найти различие между двумя массивами? (https://javascript.ru/forum/offtopic/43511-kak-najjti-razlichie-mezhdu-dvumya-massivami.html)

Maxmaxmaximus4 08.12.2013 19:03

nerv_, почти верно =) но все немного сложнее.

У меня есть 2 массива и 2 каретки, вначале обе каретки на нулях, начинаем итерировать.

1) смотрим, если значения равны, увеличиваем обе каретки на 1 continiue.
2) смотрим, если значения не равны, то начинаем делать грязь, вначале одну каретку держим на месте, а второй пробегаемся вперед пока не наткнемся на такие же число которое в первой каретке, запоминаем какое расстояние пробежала вторая каретка. Потом делаем то же самое с первой кареткой. получаем 2 кратчайщих расстояния до ближайшего "совпадения" элементов.

3) смотрим, если первое расстояние больше, то элементы были удалены, если второе больше то добавлены.

короче трудно описать словами как сделаю покажу


Цитата:

Сообщение от nerv_
upd: в пыхе, кстати есть http://php.net/manual/ru/function.levenshtein.php и http://www.php.net/manual/ru/function.similar-text.php

upd2: А вот левенштейн на js


ай красавец)!! но оно какой-то бред выдает)

Грубо говоря я хочу получить карту изменения которые мне надо произвести чтобы получить из одного массива второй =)

nerv_ 08.12.2013 19:08

Цитата:

Сообщение от Maxmaxmaximus4
У меня есть 2 массива и 2 каретки, вначале обе каретки на нулях, начинаем итерировать.

одна каретка и массив индексов другого массива. Массив индексов нужен, чтобы можно выбросить из поиска любой элемент второго массива (индекс), а также "удалить" те, кот. остались "не найденными" после прохода по первому массиву.

Короче, это гемор :D

Maxmaxmaximus4 08.12.2013 19:13

nerv_, так ты определишь вставку, а как ты определишь что элементы были удалены не пробегаясь по второму массиву?

И вообще давай ка код раз такой умный) мне кажется у тебя не получится пробегаться только по одному массиву.

Maxmaxmaximus4 08.12.2013 20:27

при чем моя реализация уже возвращает обьект типа

{
remove:[{start:3,end:4},{start:6,end:11}],
insert:[{start:1,end:2}],
replace:[]
}

monolithed 08.12.2013 20:47

Maxmaxmaximus4,
может проще форкнуть ангуляр? :)

cyber 08.12.2013 20:53

так?
Array.prototype.compare = function(arr) {
    
    var search = arr.slice(),
        remove = [];
    
    for(var i = 0, index; i < this.length; i++) {
        
        index = search.indexOf(this[i]);

		if(!~index) {
          
			remove.push(this[i]);
            
            continue;
        }
        
        delete search[index];

	};
    
    return {
        remove: remove,
        insert: search
    }
    
}

console.log([1,2,3,4].compare([2,3,4,5, 34, 2 , 3434]));

Maxmaxmaximus4 08.12.2013 21:03

Цитата:

Сообщение от monolithed
может проще форкнуть ангуляр?

а там нет этого лол) там они вообще ядерно не оптимально делают)
я и хочу переплюнуть их по этому вот.

cyber, да, ты верно понял что надо =) тока твоя реализация не может схавать даже
var q = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var w = [1, 2, 4, 5, 6, 7, 8, 9];

cyber 08.12.2013 21:57

Maxmaxmaximus4, честно , завязывай с наркотиками...
Array.prototype.compare = function(arr) {
    
    var search = arr.slice(),
        remove = [];
    
    for(var i = 0, index; i < this.length; i++) {
        
        index = search.indexOf(this[i]);

		if(!~index) {
          
			remove.push(this[i]);
            
            continue;
        }
        
        delete search[index];

	};
    
    return {
        remove: remove,
        insert: search
    }
    
}

//console.log([1,2,3,4].compare([2,3,4,5, 34, 2 , 3434]));

alert([1, 2, 3, 4, 5, 6, 7, 8, 9].compare([1, 2, 4, 5, 6, 7, 8, 9]).remove);

Maxmaxmaximus4 08.12.2013 22:08

cyber, я вообще не понимаю чо делает твоя функция она должна возвращать массив индексов, а не массив значений.

Цитата:

Сообщение от cyber
честно , завязывай с наркотиками...

это ты завязывай, если тебе говорят что ты хуйню делаешь значит прислушивайся, тем более если это говорю я, а не оскорбляй.

cyber 08.12.2013 22:34

Цитата:

Сообщение от Maxmaxmaximus4
cyber, я вообще не понимаю чо делает твоя функция она должна возвращать массив индексов, а не массив значений.

возможно я не очень внимательно читал, но исправить ее не проблема.
Цитата:

Сообщение от Maxmaxmaximus4
это ты завязывай, если тебе говорят что ты хуйню делаешь значит прислушивайся, тем более если это говорю я, а не оскорбляй.

просто сникерсни.
Хотя насчет скорости я не уверен)
Array.prototype.compare = function(arr) {
    
    var search = arr.slice(),
        insert = [],
        remove = [];
    
    for(var i = 0, index; i < this.length; i++) {
        
        index = search.indexOf(this[i]);

		if(!~index) {
          
			remove.push(i);
            
            continue;
        }
        
        delete search[index];

	};
    
    search.forEach(function (elem, i) {
        if(elem)
          insert.push(i);     
    });
    
    return {
        remove: remove,
        insert: insert
    }
    
}

//console.log([1,2,3,4].compare([2,3,4,5, 34, 2 , 3434]));

console.log([1, 2, 3, 4, 5, 6, 7, 8, 9].compare([1, 2, 4, 5, 6, 7, 8, 9]));


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