Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.02.2016, 11:58
Аспирант
Отправить личное сообщение для diga Посмотреть профиль Найти все сообщения от diga
 
Регистрация: 13.01.2016
Сообщений: 57

Разность 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, т.к. его нет в старом массиве)
Ответить с цитированием
  #2 (permalink)  
Старый 01.02.2016, 12:02
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

https://lodash.com/docs#difference
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 01.02.2016, 12:30
Аспирант
Отправить личное сообщение для diga Посмотреть профиль Найти все сообщения от diga
 
Регистрация: 13.01.2016
Сообщений: 57

Сообщение от nerv_ Посмотреть сообщение
https://lodash.com/docs#difference
ради одной операции и на один раз не охота библиотеку подгружать
Ответить с цитированием
  #4 (permalink)  
Старый 01.02.2016, 12:45
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Сообщение от diga Посмотреть сообщение
ради одной операции и на один раз не охота библиотеку подгружать
Тогда сравнивать

<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>

Последний раз редактировалось destus, 01.02.2016 в 13:06.
Ответить с цитированием
  #5 (permalink)  
Старый 01.02.2016, 12:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

функция разности массивов
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>

Последний раз редактировалось рони, 01.02.2016 в 12:57.
Ответить с цитированием
  #6 (permalink)  
Старый 01.02.2016, 12:52
Аспирант
Отправить личное сообщение для diga Посмотреть профиль Найти все сообщения от diga
 
Регистрация: 13.01.2016
Сообщений: 57

Сообщение от destus
Тогда сравнивать
в результат получаю пустой массив []
console.log("rez", arr);
Ответить с цитированием
  #7 (permalink)  
Старый 01.02.2016, 13:00
Аспирант
Отправить личное сообщение для diga Посмотреть профиль Найти все сообщения от diga
 
Регистрация: 13.01.2016
Сообщений: 57

рони,
спасибо, твой вариант работает)
Ответить с цитированием
  #8 (permalink)  
Старый 01.02.2016, 13:04
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

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>
Ответить с цитированием
  #9 (permalink)  
Старый 01.02.2016, 13:07
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Сообщение от diga Посмотреть сообщение
в результат получаю пустой массив []
console.log("rez", arr);
Какой-то косяк с добавлением поста был) Сейчас вроде скрипт запускается.
Ответить с цитированием
  #10 (permalink)  
Старый 01.02.2016, 13:12
Аспирант
Отправить личное сообщение для diga Посмотреть профиль Найти все сообщения от diga
 
Регистрация: 13.01.2016
Сообщений: 57

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


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

Последний раз редактировалось diga, 01.02.2016 в 13:51.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложение всех элементов двух массивов. sharun Общие вопросы Javascript 27 14.05.2018 15:38
Вопросы от новичка по сортировке массивов и функциям iiv Ваши сайты и скрипты 3 01.07.2014 11:39
Сумма чисел фиббоначи без использования функций и массивов. mariaanina Общие вопросы Javascript 4 03.06.2014 17:22
Пересечение и разность двух массивов harold Общие вопросы Javascript 9 18.12.2013 21:41
Сложение массивов Rentony Общие вопросы Javascript 2 08.03.2012 08:46