如何在两个数组中找到匹配的值?

我有两个数组,我希望能够比较这两个数组,并且只返回匹配的值。例如,这两个数组都有值 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
428598 次浏览

作为一个答案,这样我就可以做格式..。

这是您需要经历的过程。

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

每次迭代第一个数组中的元素时,循环遍历第二个数组,然后检查是否匹配。

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

如果值是非空字符串或数字,则可以将对象用作字典:

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;

当然,我的方法是循环访问第一个数组一次,并检查第二个数组中每个值的索引。如果索引为 > -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) {

你可以改变函数原来写 thisarr2的任何地方。

O(n*m)相比,这个函数在 O(n log(n) + m log(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"]

使用罗达什

GLOBAL.utils = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];


var result = utils.difference(arr1 , arr2);
console.log ( "result :" + result );

像下划线和 loash 这样的库有一个名为 intersection的实用方法,用于在传入的数组中查找匹配项。看看: http://underscorejs.org/#intersection

你可使用:

const intersection = array1.filter(element => array2.includes(element));

我发现@jota3建议的一个小改动对我来说非常有效。

var intersections = array1.filter(e => array2.indexOf(e) !== -1);

希望这个能帮上忙!

有一些 ES6:

let sortedArray = [];
firstArr.map((first) => {
sortedArray[defaultArray.findIndex(def => def === first)] = first;
});
sortedArray = sortedArray.filter(v => v);

此代码片段还根据 DefaultArray 默认数组的顺序对 First Arr进行排序

例如:

let firstArr = ['apple', 'kiwi', 'banana'];
let defaultArray = ['kiwi', 'apple', 'pear'];
...
console.log(sortedArray);
// ['kiwi', 'apple'];

在 array1上迭代,找到 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)
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;
});

你可以使用 javascript 函数 < a href = “ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global _ Objects/Array/find”rel = “ nofollow noReferrer”> .find() 正如 MDN 中所说的,它将返回为 true 的 < strong > 第一个值 。如果找到这样一个元素,find 将返回该元素的值。否则,find 返回 undefined

var array1 = ["cat", "sum", "fun", "run", "cat"];
var array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];


found = array1.find((val, index) => {
console.log('index', index) // Stops at 0
return array2.includes(val)
})
console.log(found)

或者使用 .filter(),它首先循环遍历每个元素,然后将结果返回给您。

var array1 = ["cat", "sum", "fun", "run", "cat"];
var array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];


found = array1.filter((val, index) => {
console.log('index', index) // Stops at array1.length - 1
return array2.includes(val)
})
console.log(found)