Как найти совпадающие значения в двух массивах?
У меня есть два массива, и я хочу иметь возможность сравнивать два и возвращать только совпадающие значения. Например, оба массива имеют значение cat
, так что именно это и будет возвращено. Я не нашел ничего подобного. Каков наилучший способ вернуть сходство?
var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
//if value in array1 is equal to value in array2 then return match: cat
Ответы
Ответ 1
Естественно, мой подход состоял в том, чтобы один раз пройти через первый массив и проверить индекс каждого значения во втором массиве. Если индекс > -1
, а затем push
ее на возвращаемый массив.
Array.prototype.diff = function(arr2) {
var ret = [];
for(var i in this) {
if(arr2.indexOf(this[i]) > -1){
ret.push(this[i]);
}
}
return ret;
};
Мое решение не использует два цикла, как другие, поэтому оно может работать немного быстрее. Если вы хотите избежать использования for..in
, вы можете сначала отсортировать оба массива, чтобы переиндексировать все их значения:
Array.prototype.diff = function(arr2) {
var ret = [];
this.sort();
arr2.sort();
for(var i = 0; i < this.length; i += 1) {
if(arr2.indexOf(this[i]) > -1){
ret.push(this[i]);
}
}
return ret;
};
Использование будет выглядеть так:
var array1 = ["cat", "sum","fun", "run", "hut"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
console.log(array1.diff(array2));
Если у вас есть проблема с расширением прототипа Array, вы можете легко изменить его на функцию.
var diff = function(arr, arr2) {
И вы бы изменили в любом месте, где func первоначально сказал this
arr2
.
Ответ 2
Вы можете использовать:
const intersection = array1.filter(element => array2.includes(element));
Ответ 3
Эта функция работает в O(n log(n) + m log(m))
по сравнению с O(n*m)
(как видно из других решений с циклами /indexOf
), что может быть полезно, если вы имеете дело со множеством значений.
Однако, поскольку ни "a" > 1
, ни "a" < 1
, это работает только для элементов того же типа.
function intersect_arrays(a, b) {
var sorted_a = a.concat().sort();
var sorted_b = b.concat().sort();
var common = [];
var a_i = 0;
var b_i = 0;
while (a_i < a.length
&& b_i < b.length)
{
if (sorted_a[a_i] === sorted_b[b_i]) {
common.push(sorted_a[a_i]);
a_i++;
b_i++;
}
else if(sorted_a[a_i] < sorted_b[b_i]) {
a_i++;
}
else {
b_i++;
}
}
return common;
}
Пример:
var array1 = ["cat", "sum", "fun", "hut"], //modified for additional match
array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
intersect_arrays(array1, array2);
>> ["cat", "hut"]
Ответ 4
Я обнаружил небольшое изменение в отношении того, что @jota3 предложил работать отлично для меня.
var intersections = array1.filter(e => array2.indexOf(e) !== -1);
Надеюсь, это поможет!
Ответ 5
Прокручивайте второй массив каждый раз, когда вы перебираете элемент в первом массиве, затем проверяйте наличие совпадений.
var array1 = ["cat", "sum", "fun", "run"],
array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
function getMatch(a, b) {
var matches = [];
for ( var i = 0; i < a.length; i++ ) {
for ( var e = 0; e < b.length; e++ ) {
if ( a[i] === b[e] ) matches.push( a[i] );
}
}
return matches;
}
getMatch(array1, array2); // ["cat"]
Ответ 6
Библиотеки, такие как underscore и lodash, имеют метод утилиты, называемый intersection
, чтобы найти совпадения в переданных массивах. Посмотрите на: http://underscorejs.org/#intersection
Ответ 7
var array1 = [1, 2, 3, 4, 5, 6],
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var array3 = array2.filter(function(obj) {
return array1.indexOf(obj) == -1;
});
Ответ 8
Сделано как ответ, поэтому я могу сделать форматирование...
Это процесс, который вам нужно пройти. Цитирование через массив для специфики.
create an empty array
loop through array1, element by element. {
loop through array2, element by element {
if array1.element == array2.element {
add to your new array
}
}
}
Ответ 9
use lodash
GLOBAL.utils = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];
var result = utils.difference (arr1 , arr2);
console.log ( "result :" + result );
Ответ 10
С некоторыми ES6:
let sortedArray = [];
firstArr.map((first) => {
sortedArray[defaultArray.findIndex(def => def === first)] = first;
});
sortedArray = sortedArray.filter(v => v);
Этот фрагмент также сортирует firstArr на основе порядка defaultArray
лайк:
let firstArr = ['apple', 'kiwi', 'banana'];
let defaultArray = ['kiwi', 'apple', 'pear'];
...
console.log(sortedArray);
// ['kiwi', 'apple'];
Ответ 11
Если ваши значения являются ненулевыми строками или цифрами, вы можете использовать объект в качестве словаря:
var map = {}, result = [], i;
for (i = 0; i < array1.length; ++i) {
map[array1[i]] = 1;
}
for (i = 0; i < array2.length; ++i) {
if (map[array2[i]] === 1) {
result.push(array2[i]);
// avoid returning a value twice if it appears twice in array 2
map[array2[i]] = 0;
}
}
return result;
Ответ 12
Выполните итерацию по array1 и найдите элемент indexof, присутствующий в array2.
var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","sun", "hut", "gut"];
var str='';
for(var i=0;i<array1.length;i++){
if(array2.indexOf(array1[i]) != -1){
str+=array1[i]+' ';
};
}
console.log(str)
Ответ 13
Вы можете использовать функцию javascript .find()
Как сказано в MDN, она вернет первое значение, которое является истинным. Если такой элемент найден, find немедленно возвращает значение этого элемента. В противном случае поиск возвращает undefined
.
var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];
found = array1.find( val => array2.includes(val) )
console.log(found)