我有两个数组,我希望能够比较两者并只返回匹配的值。例如,两个数组都具有值,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
我有两个数组,我希望能够比较两者并只返回匹配的值。例如,两个数组都具有值,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
您可以使用 :
const intersection = array1.filter(element => array2.includes(element));
当然,我的方法是遍历第一个数组一次并检查第二个数组中每个值的索引。如果索引为> -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
。
我发现@jota3 建议的内容略有改动,对我来说非常有效。
var intersections = array1.filter(e => array2.indexOf(e) !== -1);
希望这可以帮助!
O(n log(n) + m log(m))
与O(n*m)
(如在其他带有 loops/ 的解决方案中所见)相比,此函数运行,这在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"]
每次迭代第一个数组中的元素时循环遍历第二个数组,然后检查匹配项。
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"]