Как вычесть массив из массива js
Операция «вычитания» массива из массива сводится к перебору на наличие элементов первого массива во втором. Разность двух массивов даст нам элементы первого массива, которых нет во втором. Рассмотрим пример на плоских структурах. «Вычтем» из массива A массив B c помощью методов массивов — filter() и includes()
const arr_A = [1, 2, 3, 4, 5, 6, 7]; const arr_B = [5, 6, 7, 8, 9, 10]; const result = arr_A.filter(el_A => !arr_B.includes(el_A)); // Результат: [1, 2, 3, 4]
Более сложный пример, с вложенными структурами. Необходимо произвести вычитание, но только лишь по одному из ключей, например по полю name. Для этого удобно применить метод some().
const arr_A = [name: 'Ivan', age: 32>, name: 'Nikolay', age: 24>, name: 'Anna', age: 24>]; const arr_B = [name: 'Nikolay', age: 24>]; const result = arr_A.filter(person_A => !arr_B.some(person_B => person_A.name === person_B.name)); // Результат [ < name: 'Ivan', age: 32 >, < name: 'Anna', age: 24 >]
Также можно воспользоваться методом из библиотеки Lodash — difference
_.difference([5, 2, 1], [2, 3]); // Результат => [5, 1]
15 марта 2023
Вычитание массива из другого массива в буквальном смысле (как математическая операция) не совсем корректная операция. Обращаясь ко всему массиву мы получаем ссылку в памяти, где хранится данный массив.
[1, 2, 3] - [1, 2, 3]; // NaN
Мы получили NaN (not a number) как результат операции вычитания. И это логично, ведь результат не представляет собой математически корректную операцию.
Однако, мы можем провести вычитание элементов этих массивов. Это просто, когда мы знаем точно о том, что хранится в этих массивах, сколько элементов содержит каждый.
const arrA = [100, 500]; const arrB = [101, 505]; console.log(arrA[0] - arrB[1]); // корректная операция
Другие, более сложные случаи вычитания элементов двух массивов зависят от задачи и могут решаться по-разному.
Как из одного массива вычесть другой
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel
Помог: 3 раз(а)
Секрет
Теперь, когда вы уже наверняка второпях отправили свой запрос,
я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
даже если первый ответ по теме последуем сразу же.
Само собой я знаю что ответят мне тут же, и если я посмотрю
на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
вопрос автора и еще два сообщение вида Ответ + Спасибо
После этого приходится начинать уточнять этим неграмотным что мне надо.
Они что, сами читать не умеют? А уточнять приходится.
И иногда пока они переварят то что я им скажу проходит и не одна ночь..
Уверен что если бы я им сказал что у меня есть
фиолетовый квадрат, и нужно превратить его в синий треугольник
и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
но почему то кисточка не принимала цвет краски в банке,
то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
предложив её открыть, а не тратить еще стольник на жестянку.
Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
Что есть
Что нужно получить
Как я пытался
Почему или что у меня не получилось.
На последок как оно происходит на форумах
Цитата:
Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно.
Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12
Как вычесть массив из массива?
Необходимо найти разницу, те сравнить 2 массива и оставить только неповторяющиеся элементы. Порядок не важен. Дублирование значений в массивах исключено. Изначально известно что М1 содержит 50 элементов М2, их только нужно оттуда убрать. Долго не было ответа, решил вот так: Спасибо за помощь.
private int[] delArray(int[] a, int[] b) < Listlist_A = new ArrayList(); for (int index = 0; index < a.length; index++) < list_A.add(a[index]); >List list_B = new ArrayList(); for (int index = 0; index < b.length; index++) < list_B.add(b[index]); >list_A.removeAll(list_B); int[] ret = new int[list_A.size()]; for(int i = 0;i
Отслеживать
Ivan Stasiuk
задан 9 июл 2016 в 17:01
Ivan Stasiuk Ivan Stasiuk
470 1 1 золотой знак 4 4 серебряных знака 22 22 бронзовых знака
Нужно больше деталей. Важен ли порядок, возможно ли дублирование значений в исходных массивах. В самом простом случае вам поможет Set.removeAll , но он не сохраняет порядок и не допускает дублирования элементов
9 июл 2016 в 17:35
@soon обновил описание.
9 июл 2016 в 17:41
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
final int[] a1 = ; final int[] a2 = ; List intList = new ArrayList() >; List intList_2 = new ArrayList() >; intList.removeAll(intList_2); for (int a : intList) System.out.println(a);
Отслеживать
ответ дан 9 июл 2016 в 18:20
Shwarz Andrei Shwarz Andrei
12k 1 1 золотой знак 20 20 серебряных знаков 40 40 бронзовых знаков
Насколько я понимаю, ваш вариант в итоге выводит List
9 июл 2016 в 18:29
В случае, если порядок элементов неважен и входные массивы не содержат дублирующихся эллементов, то самый простой путь — создать Set из массива и удалить из него все элементы, содержащиеся во втором массиве:
Проблема лишь в том, как нормально создать Set из массива. Стандартный конструктор HashSet принимает Collection , поэтому необходимо преобразовать int[] в список (к примеру). Если есть поддержка Google Guava, то можно воспользоваться стандартным методом Ints.asLists . Его сложность в документации не указана, но если заглянуть в реализацию, то можно увидеть, что это О(1):
int[] m1 = new int[]; int[] m2 = new int[]; Set s = new HashSet<>(Ints.asList(m1)); s.removeAll(Ints.asList(m2)); s.forEach(System.out::println);
В противном случае можно создать свой метод для создания множества из целочисленного массива:
public static Set asSet(int[] arr) < Sets = new HashSet<>(); for (int x : arr) < s.add(x); >return s; >
Ну а если есть поддержка Java 8 (полагаю, в рамках Android это пока неуместно, но все же), то можно воспользоваться Stream :
Set s = IntStream.of(m1).boxed().collect(toSet()); s.removeAll(IntStream.of(m1).boxed().collect(toList())); s.forEach(System.out::println);
Если элементов немного, то можно обойтись без множеств а просто проверить все элементы (осторожно: квадратичная сложность):
IntStream.of(m1).filter(x -> IntStream.of(m2).noneMatch(y -> x == y)).forEach(System.out::println);
forum.lissyara.su
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
- Отправить тему по email
- Версия для печати
Первое новое сообщение • 3 сообщения • Страница 1 из 1
Podedinov мл. сержант Сообщения: 84 Зарегистрирован: 2008-12-28 11:50:19
Вычетание одного массива из другого
- Пожаловаться на это сообщение
- Цитата
Вот вопрос как можно вычесть один массив и из другого, допустим:
@a=(1,2,3,4,5,6,7,8,9); @b=(1,2,3,4,5); @a-@b=@c=(6,7,8,9);
Podedinov
Хостинг HostFood.ru
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
Гость проходил мимо
Re: Вычетание одного массива из другого
- Пожаловаться на это сообщение
- Цитата
Непрочитанное сообщение Гость » 2010-04-08 15:47:53
В инете нашлось вот:
my @small = ( 1, 2, 3, 4, 5 ); my @big = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ); my @res; my %h; foreach (@small) < $h= 1; > foreach (@big) < push @res, $_ unless (defined($h)); >
в @res — результат
Гость
ProFTP подполковник Сообщения: 3388 Зарегистрирован: 2008-04-13 1:50:04 Откуда: %&й Контактная информация:
Re: Вычетание одного массива из другого
- Пожаловаться на это сообщение
- Цитата
use Quantum::Superpositions; @a = (a,a,1,1,2,3,4,5,6,7,8,9,10); # integers @b = (1,2,4,6,8,10,12,14,16,18,20); # doubled # @c = @a; my @unionAB = sort < $a $b > eigenstates( any(@a, @b) ); my @intersectionAB = sort < $a $b > eigenstates( any(@a) != any(@b) ); my @differenceAB = sort < $a $b > eigenstates( any(@a) != all(@b) ); # print "@intersectionAB\n"; # print " @unionAB \n"; print " @differenceAB \n";
$ ./perl.pl a 3 5 7 9
Pеrl FAQ
perl -e ‘print join»»,map $$_[rand@$_],([0..9,’a’..’z’,’A’..’Z’])x30′ 
