Сравнение двух массивов с объектами
Вопрос, массивы отсортированы, и id у них числовые? Можно ли строить алгоритм на том, что id — это 1,2,3 и т.д. Или же они могуть быть разнообразные? В зависимости от ответа, могут быть разные алгоритмы по производительности
13 окт 2021 в 8:14
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Тяжело представить вычисление пересечения массива без переобходов. Единственное, что могу предложить — сократить количество операций.
Для начала, стоит определить самый маленький массив, так как результирующий массив не будет больше самого маленького, но позволит сократить количество обходов для ряда значений, которые есть в большем, но отсутствуют в меньшем массиве. Это позволит убрать push и использовать filter.
Вторым этапом, нам нет нужды во втором массива обходить его весь, как у вас. Достаточно первого совпадения, в этом нам поможет some. Таким образом мы гарантированно обойдем оба массива только когда нет ни одного соответствия. В случае с совпадением, мы выйдем при первом же совпадении.
const arr1 = [ < id: 1 >, < id: 2 >, < id: 3 >, < id: 4 >] const arr2 = [ < id: 1 >, < id: 4 >, < id: 5 >, ] const leastArr = arr1.length < arr2.length ? arr1 : arr2; const biggestArr = arr1.length >= arr2.length ? arr1 : arr2; const resultArray = leastArr.filter((item) => < return biggestArr.some((item2) =>item2.id === item.id) >); console.log(resultArray);
Как сравнить два массива
Подскажите по алгоритму сопоставления двух массивов.
Есть 2 одномерных массива.
Бывает первый имеет больше значений, чем второй, бывает наоборот. Нужно сопоставить массивы, чтобы в одном из них, остались только те значения, которых нет во втором.
Например, МассивПервый(1,2,3,3,7); МассивВторой (1,2,2,3,4,5).
В первом массиве должны остаться только значения 3 и 7.
Вариант, который ниже не подходит, так как он удаляет в нужном массиве все совпадения, все зависимости сколько раз они встречаются, а мне так не надо.
Индекс1 = 0;
Пока Индекс1 < Массив1Размер Цикл
Индекс2 = 0;
Пока Индекс2 < Всего2 Цикл
Если Массив2[Индекс2] = Массив1[Индекс1] Тогда
Массив2(Индекс2);
Массив2Размер= Массив2Размер — 1;
Иначе
Индекс2 = Индекс2 + 1;
КонецЕсли;
КонецЦикла;
Индекс1 = Индекс1 + 1;
КонецЦикла;
Поправил
Индекс1 = 0;
Пока Индекс1 < Массив1Размер Цикл
Индекс2 = 0;
Пока Индекс2 < Массив2Размер Цикл
Если Массив2[Индекс2] = Массив1[Индекс1] Тогда
Массив2(Индекс2);
Массив2Размер= Массив2Размер — 1;
Иначе
Индекс2 = Индекс2 + 1;
КонецЕсли;
КонецЦикла;
Индекс1 = Индекс1 + 1;
КонецЦикла;
Добавить оба массива в ТЗ и свернуть
(2) Можно пример?
Я имею ввиду, как свернуть, а не добавить в ТЗ
«Нужно сопоставить массивы, чтобы в одном из них, остались только те значения, которых нет во втором.
Например, МассивПервый(1,2,3,3,7); МассивВторой (1,2,2,3,4,5).
В первом массиве должны остаться только значения 3 и 7. »
3 есть же во втором.
(4) Вот люди)
Свернуть — у таб знач есть метод. смотри хелп.
(5) Да, 3 есть во втором массиве. А в первом массиве, две штуки 3, поэтому 3 и 7 должны остаться.
Понятно, свернуть не пойдет, совпадение значений по индексу надо
Граница = Мин(Массив1.Количество(), Массив2.Количество());
ОниСовпадают = Истина;
Для СчЦ=0 по Граница-1 Цикл
Если Массив1[СчЦ]<>Массив2[СчЦ] Тогда
ОниСовпадают = Ложь;
Прервать;
(8) Да, свернуть не подойдет. Есть пример алгоритма для такого сравнения? Я ничо не нашел. Какая то экзотика.
>Например, МассивПервый(1,2,3,3,7); МассивВторой (1,2,2,3,4,5).
>В первом массиве должны остаться только значения 3 и 7.
почему в первом должно остаться 3 и 7, а не только 7?
(8) + Определить мин индикса, сравнивать, преобразовывать. А вот вопрос — если в первом индекс больше — значения отсекаются или остаются.
(11) Потому-что значение индекса 2 не совпадают
(12) * индекса
(13) а, ну тогда в (11) заготовка. Там, где ОниСовпадают = Ложь; надо добавлять значения в третий массив, где будут храниться несовпадения
(10) В (11) хорошо показано, в (15) сказано, что нужен третий массив, куда будут пихаться все несовпадения.
Свернуть, кажется, тоже можно, нужно просто уметь делить на два с остатком, ну и это будет
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Значение»);
ТЗ.Колонки.Добавить(«Индекс»);
ТЗ.Колонки.Добавить(«Показатель»);
Для СчЦ=0 по Массив1.Количество()-1 Цикл
ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), Новый Структура(«Значение, Индекс, Показатель», Массив1[СчЦ], СчЦ, 5));
КонецЦикла;
Для СчЦ=0 по Массив2.Количество()-1 Цикл
ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), Новый Структура(«Значение, Индекс, Показатель», Массив2[СчЦ], СчЦ, 7));
КонецЦикла;
ТЗ.Свернуть(«Индекс, Значение», «Показатель»);
Для каждого Строка из ТЗ Цикл
Если Строка.Показатель%2=0 Тогда
Сообщить(Строка.Значение);
КонецЕсли;
КонецЦикла;
только это дохрена больше строк кода
(16) не подходит этот алгоритм. Потому что сравнение идет по индексам, первые не совпали, сразу идет Прервать. А надо, чтобы первый индекс первого массива искал совпадения по всем индексам второго массива, начиная с первого (ну то есть с нулевого) и если нет совпадения, индекс первого массива увеличивался на 1, а если есть совпадение, тогда эти индексы в поиске больше не участвуют.
(18) окуеть у тебя проблема. Ну, заплати кому-нибудь, чтобы он убрал Прервать.
поездец вообще! Готовый же код дал.
Я глубоко шокирован
пПервыйМассив = Новый Массив;
пПервыйМассив.Добавить( 1 );
пПервыйМассив.Добавить( 2 );
пПервыйМассив.Добавить( 3 );
пПервыйМассив.Добавить( 3 );
пПервыйМассив.Добавить( 7 );
пВторойМассив = Новый Массив;
пВторойМассив.Добавить( 1 );
пВторойМассив.Добавить( 2 );
пВторойМассив.Добавить( 2 );
пВторойМассив.Добавить( 3 );
пВторойМассив.Добавить( 4 );
пВторойМассив.Добавить( 5 );
пТаблицаОбъединения = Новый ТаблицаЗначений;
пТаблицаОбъединения.Колонки.Добавить( «КолонкаЧисло», Новый ОписаниеТипов( «Число» ) );
пТаблицаОбъединения.Колонки.Добавить( «КолонкаИндекс», Новый ОписаниеТипов( «Число» ) );
пТаблицаОбъединения.Колонки.Добавить( «КолонкаСчетчик», Новый ОписаниеТипов( «Число» ) );
Для пИндекс = 0 По пПервыйМассив.Количество() — 1 Цикл
пЗапись = пТаблицаОбъединения.Добавить();
пЗапись.КолонкаЧисло = пПервыйМассив[ пИндекс ];
пЗапись.КолонкаИндекс = пИндекс;
пЗапись.КолонкаСчетчик = 1;
Для пИндекс = 0 По пВторойМассив.Количество() — 1 Цикл
пЗапись = пТаблицаОбъединения.Добавить();
пЗапись.КолонкаЧисло = пВторойМассив[ пИндекс ];
пЗапись.КолонкаИндекс = пИндекс;
пЗапись.КолонкаСчетчик = 2;
пТаблицаОбъединения.Свернуть( «КолонкаЧисло, КолонкаИндекс», «КолонкаСчетчик» );
Для Каждого пЗапись Из пТаблицаОбъединения.НайтиСтроки( Новый Структура( «КолонкаСчетчик», 1 ) ) Цикл
Сообщить( «Индекс: » + пЗапись.КолонкаИндекс + » Число: » + пЗапись.КолонкаЧисло );
(22) Близко, но тоже не то.
Так как ,если, например, Массив1 состоит из (1,2,3), а Массив2 состоит из (2,1,3), то эти массивы должны «совпадать», так как все элементы встречаются в обоих массивах, хоть и в разных индексах, а код (21) тут уже не справляется.
(22) Тогда у тебя условие не правильное:
В первом массиве должны остаться только значениЕ 7.
пПервыйМассив = Новый Массив;
пПервыйМассив.Добавить( 1 );
пПервыйМассив.Добавить( 2 );
пПервыйМассив.Добавить( 3 );
пПервыйМассив.Добавить( 3 );
пПервыйМассив.Добавить( 7 );
пВторойМассив = Новый Массив;
пВторойМассив.Добавить( 1 );
пВторойМассив.Добавить( 2 );
пВторойМассив.Добавить( 2 );
пВторойМассив.Добавить( 3 );
пВторойМассив.Добавить( 4 );
пВторойМассив.Добавить( 5 );
пТаблицаОбъединения = Новый ТаблицаЗначений;
пТаблицаОбъединения.Колонки.Добавить( «КолонкаЧисло», Новый ОписаниеТипов( «Число» ) );
пТаблицаОбъединения.Колонки.Добавить( «КолонкаСчетчик», Новый ОписаниеТипов( «Число» ) );
Для пИндекс = 0 По пПервыйМассив.Количество() — 1 Цикл
пЗапись = пТаблицаОбъединения.Добавить();
пЗапись.КолонкаЧисло = пПервыйМассив[ пИндекс ];
пЗапись.КолонкаСчетчик = 1;
Для пИндекс = 0 По пВторойМассив.Количество() — 1 Цикл
пЗапись = пТаблицаОбъединения.Добавить();
пЗапись.КолонкаЧисло = пВторойМассив[ пИндекс ];
пЗапись.КолонкаСчетчик = 2;
пТаблицаОбъединения.Свернуть( «КолонкаЧисло», «КолонкаСчетчик» );
Для Каждого пЗапись Из пТаблицаОбъединения.НайтиСтроки( Новый Структура( «КолонкаСчетчик», 1 ) ) Цикл
Сообщить( «Число: » + пЗапись.КолонкаЧисло );
(24) И значение 3 тоже должно остаться, так как во втором Массиве одна 3, а в первом две 3.
То есть 3 из первого массива совпала с 3 из второго массива. Теперь мы их не учитываем (или удаляем). В первом массиве осталась одна 3, а во втором теперь ее нет, также в первом массиве осталась 7, котором также нет во втором массиве. Итого результат «сравнения» должен быть 3 и 7.
Продвинутые методы программирования на JavaScript: сравнение элементов двух массивов
Массивы ( Arrays ) являются неотъемлемой частью программирования. Поэтому нам, программистам и разработчикам, необходимо научиться эффективно с ними работать. В данном случае речь пойдет об умении быстро и легко выполнять операции, связанные со сравнением массивов. Знакомясь с различными подходами и решениями, осваивая продвинутые методы, мы совершенствуем свои навыки в области программирования.
Итак, как же сравнить два массива? Как определить в них общие, различные и симметрично различные элементы? В статье рассмотрим 2 метода решения этой задачи: сначала с использованием объектов Set , затем с применением функций высшего порядка.
Пересечение массивов (использование Set)
Чтобы найти intersection (пересечение) элементов двух массивов, проверим наличие каждого элемента первого массива во втором массиве. Элемент, который есть в обоих массивах, добавим в новый массив. Таким образом мы преобразуем оба массива в объекты Set . Затем с помощью метода has() проверим, есть ли каждый элемент массива nums1 в setNums2 Set Object .
let nums1 = [1, 2, 3, 4, 5]
let nums2 = [3, 4, 5, 6]let setNums1 = new Set(nums1)
let setNums2 = new Set(nums2)let intersections = nums1.filter((num) =>
setNums2.has(num))console.log(intersections) // [ 3, 4, 5 ]let setIntersections = new Set(intersections)console.log(setIntersections) // Set
Различие массивов (использование Set)
Теперь найдем в массиве nums1 элементы, которых нет в setNums2 Set Object . В данном примере 1 и 2 — это элементы, удовлетворяющие этому критерию в массиве nums1 .
let nums1 = [1, 2, 3, 4, 5]
let nums2 = [3, 4, 5, 6]let setNums1 = new Set(nums1)
let setNums2 = new Set(nums2)let differences = nums1.filter((num) =>
!setNums2.has(num))console.log(differences) // [ 1, 2 ]
Симметричное различие массивов (использование Set)
Теперь найдем в массивах nums1 и nums2 уникальные элементы — те, которые не находятся в обоих массивах одновременно.
let nums1 = [1, 2, 3, 4, 5]
let nums2 = [3, 4, 5, 6]let setNums1 = new Set(nums1)
let setNums2 = new Set(nums2)let symmetrics = nums1
.filter((num) => return !setNums2.has(num)
>)
.concat(
nums2.filter((num) => return !setNums1.has(num)
>)
)console.log(symmetrics) // [ 1, 2, 6 ]
Пересечение массивов (использование функций высшего порядка)
Чтобы найти пересекающиеся элементы двух массивов, нужно посмотреть, есть ли каждый элемент первого массива во втором массиве. Если он есть во втором массиве, то это значение должно быть возвращено в новый массив. В этом случае можно использовать методы filter и includes в JavaScript.
let arr1 = [“a”, “b”, “e”, “f”]
let arr2 = [“a”, “b”, “c”, “d”]let intersection = arr1.filter((item) =>
arr2.includes(item))console.log(intersection) // [ ‘a’, ‘b’ ]
Различие массивов (использование функций высшего порядка)
В отличие от описанной выше ситуации, теперь все должно быть в точности наоборот. Каждый элемент первого массива не должен находиться во втором массиве. В данном примере “e” и “f” являются элементами, находящимися только в массиве arr1 .
let arr1 = [“a”, “b”, “e”, “f”]
let arr2 = [“a”, “b”, “c”, “d”]let difference = arr1.filter((item) =>
!arr2.includes(item))console.log(difference) // [ ‘e’, ‘f’ ]
Так же находим элементы, находящиеся только во втором массиве.
let arr1 = [‘a’, ‘b’, ‘e’, ‘f’]
let arr2 = [‘a’, ‘b’, ‘c’, ‘d’]let difference = arr2.filter((item) =>
!arr1.includes(item))console.log(difference) // [ ‘c’, ‘d’ ]
Симметричное различие массивов (использование функций высшего порядка)
Все элементы, кроме элементов пересечения массивов, являются симметрично различными элементами. В данном случае это элементы “e” и “f” из первого массива и “c” и “d” из второго массива. Чтобы добавить эти элементы в массив, воспользуемся методом concat .
let symetric = arr2
.filter((item) => return !arr1.includes(item)
>)
.concat(
arr1.filter((item) => return !arr2.includes(item)
>)
)console.log(symetric) // [ ‘c’, ‘d’, ‘e’, ‘f’ ]
Заключение
Мы рассмотрели наиболее распространенные случаи использования объекта Set , а также уделили внимание методам filter , includes и concat . Надеюсь, статья была полезной для вас и вы успешно примените полученные знания на практике!
- Как это использовать: объявление функции и функциональные выражения
- Как использовать ESLint, чтобы повысить качество кода JavaScript и TypeScript
- Как не лажать с JavaScript. Часть 4
Читайте нас в Telegram, VK и Дзен
как сравнить два массива в javascript
Прямое сравнение массивов всегда будет давать результат false . Поскольку массив, как объект, указывает на ссылку памяти, где хранится «значение». И эти ссылки всегда будут разными, за исключением случая когда мы сравниваем один и тот же объект (массив).
[1, 2, 3] === [1, 2, 3]; // false [1, 2, 3] > [1, 2, 3]; // false [1, 2, 3] [1, 2, 3]; // false
const a = [10, 11]; const b = a; console.log(a === b); // true
В последнем случае мы сравниваем один и тот же массив и получаем true , т.к. в b скопировалась ссылку на этот массив, а не значение.
26 сентября 2022
Для того чтобы сравнить два массива и получить результат — например список уникальных значений, можно воспользоваться вложенными циклами:
const arr1 = [1,2,3,6,5]; const arr2 = [1,6,7,8]; const result = []; for (let i = 0; i arr1.length; i++) for (let j = 0; j arr2.length; j++) if (arr1[i] === arr2[j]) result.push(arr1[i]) > > >