01.02.2016, 11:58
|
Аспирант
|
|
Регистрация: 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, т.к. его нет в старом массиве)
|
|
01.02.2016, 12:02
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
01.02.2016, 12:30
|
Аспирант
|
|
Регистрация: 13.01.2016
Сообщений: 57
|
|
ради одной операции и на один раз не охота библиотеку подгружать
|
|
01.02.2016, 12:45
|
|
Профессор
|
|
Регистрация: 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.
|
|
01.02.2016, 12:48
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,133
|
|
функция разности массивов
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.
|
|
01.02.2016, 12:52
|
Аспирант
|
|
Регистрация: 13.01.2016
Сообщений: 57
|
|
Сообщение от destus
|
Тогда сравнивать
|
в результат получаю пустой массив []
console.log("rez", arr);
|
|
01.02.2016, 13:00
|
Аспирант
|
|
Регистрация: 13.01.2016
Сообщений: 57
|
|
рони,
спасибо, твой вариант работает)
|
|
01.02.2016, 13:04
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,133
|
|
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>
|
|
01.02.2016, 13:07
|
|
Профессор
|
|
Регистрация: 18.05.2011
Сообщений: 1,207
|
|
Сообщение от diga
|
в результат получаю пустой массив []
console.log("rez", arr);
|
Какой-то косяк с добавлением поста был) Сейчас вроде скрипт запускается.
|
|
01.02.2016, 13:12
|
Аспирант
|
|
Регистрация: 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.
|
|
|
|