Разность 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, т.к. его нет в старом массиве) |
|
Цитата:
|
Цитата:
<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> |
функция разности массивов
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> |
Цитата:
console.log("rez", arr); |
рони,
спасибо, твой вариант работает) |
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)) }).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> |
Цитата:
|
спасибо всем, а если теперь попробовать немного усложнить задачу следующим образом:
все тоже самое, только результатом должен быть 2 массива, которые отличается между собой регистром. т.е. если newArr = ['P','P','Q','R']; oldArr = ['P','P', 'Q', 'p', 'Q','R', 'p']; результатом будет res1=['Q'] и res2=['p', 'p'] |
Часовой пояс GMT +3, время: 14:31. |