Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Разность 2-х массивов (https://javascript.ru/forum/misc/61029-raznost-2-kh-massivov.html)

diga 01.02.2016 11:58

Разность 2-х массивов
 
Доброго дня суток! Помогите написать скрипт разности 2-х массивов (не множеств). Т.е. допустим имеется 2 массива (не важно упорядочен или нет)
newArr = ['P','P','Q','R'];
oldArr = ['P','P', 'Q','Q','R'];

результатом разности должен быть 'Q'.
или
newArr = ['P','P','Q','R'];
oldArr = ['P','P', 'Q', 'p', 'Q','R', 'p'];

результатом разности должен быть 'Q', 'p', 'p'.

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

P.S. новый массив всегда состоит из элементов старого массива, т.е. там не может быт такого:
newArr = [1,5,4,8];
oldArr = [5,1,9,8,10];

(в новом массиве не может быть числа 4, т.к. его нет в старом массиве)

nerv_ 01.02.2016 12:02

https://lodash.com/docs#difference

diga 01.02.2016 12:30

Цитата:

Сообщение от nerv_ (Сообщение 405861)

ради одной операции и на один раз не охота библиотеку подгружать

destus 01.02.2016 12:45

Цитата:

Сообщение от diga (Сообщение 405867)
ради одной операции и на один раз не охота библиотеку подгружать

Тогда сравнивать

<script>	
		
		var newArr = ['P','P','Q','R'], oldArr = ['P','P', 'Q', 'p', 'Q','R', 'p'], arr=[];
		for (var i = 0; i < oldArr.length; i++)
		{
			var elem = oldArr[i];
			var index = newArr.indexOf(elem);
			if ( index != -1){
				newArr.splice(index,1);	
			}
			else { arr.push(elem); }			
		}
		document.write(arr);
		
   </script>

рони 01.02.2016 12:48

функция разности массивов
 
diga,
<script>
function fn(b, a) {
    a = a.slice();
    b = b.slice();
    if (b.length > a.length) {
        var c = b;
        b = a;
        a = c
    }
    return a.filter(function(a) {
        a = b.indexOf(a);
        return !(~a && b.splice(a, 1))
    })
};
document.write(fn(['P','P','Q','R'],['P','P', 'Q','Q','R'])+"<br>");
document.write(fn(['P','P', 'Q','Q','R'],['P','P','Q','R'])+"<br>");
document.write(fn(['P','P','Q','R'],['P','P', 'Q', 'p', 'Q','R', 'p'])+"<br>")
document.write(fn(['P','P', 'Q', 'p', 'Q','R', 'p'],['P','P','Q','R'])+"<br>")
</script>

diga 01.02.2016 12:52

Цитата:

Сообщение от destus
Тогда сравнивать

в результат получаю пустой массив []
console.log("rez", arr);

diga 01.02.2016 13:00

рони,
спасибо, твой вариант работает)

рони 01.02.2016 13:04

diga,
на всякий случай полная версия разницы двух массивов, выше для условия что
Цитата:

Сообщение от diga
P.S. новый массив всегда состоит из элементов старого массива

<script>
function fn(b, a) {
    a = a.slice();
    b = b.slice();
    if (b.length > a.length) {
        var c = b;
        b = a;
        a = c
    }
    return a.filter(function(a) {
        a = b.indexOf(a);
        return !(~a && b.splice(a, 1))
    }).concat(b)
};
document.write(fn(['P','P','Q','R'],['P','P', 'Q','Q','R'])+"<br>");
document.write(fn(['P','P', 'Q','Q','R'],['P','P','Q','R'])+"<br>");
document.write(fn(['P','P','Q','R'],['P','P', 'Q', 'p', 'Q','R', 'p'])+"<br>")
document.write(fn(['P','P', 'Q', 'p', 'Q','R', 'p',8],['P','P','Q','R',4])+"<br>")
</script>

destus 01.02.2016 13:07

Цитата:

Сообщение от diga (Сообщение 405870)
в результат получаю пустой массив []
console.log("rez", arr);

Какой-то косяк с добавлением поста был) Сейчас вроде скрипт запускается.

diga 01.02.2016 13:12

спасибо всем, а если теперь попробовать немного усложнить задачу следующим образом:
все тоже самое, только результатом должен быть 2 массива, которые отличается между собой регистром.
т.е. если
newArr = ['P','P','Q','R'];
oldArr = ['P','P', 'Q', 'p', 'Q','R', 'p'];


результатом будет res1=['Q'] и res2=['p', 'p']


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