在javascript中搜索具有重复值的两个数组中的匹配值

search for matching values in two arrays with repeated values in javascript

本文关键字:两个 数组 javascript 搜索      更新时间:2023-09-26

我有两个数组:

a = [2,2,3,0,6]
b = [6,3,2,2,0]

我正在尝试使用for循环来匹配值,并在新的数组c中获取a的索引。我们该如何做到这一点?请注意,有多个值匹配,因此我认为必须跳过上一个匹配。

这是一个尊重最后一个索引并进一步研究的建议。

工作原理:

它使用Array#map来迭代带有回调的数组b。map得到一个自己的CCD_ 3空间,其中有一个真正空的对象CCD_。

回调具有参数bb,它是`b的一个元素。

接下来是基于前面的搜索,找到具有Array#indexOffromIndex的数组a中的元素。前一个索引存储在this对象中,只要结果不是-1,因为这会将fromIndex重置为零。

如果没有this[bb]this[bb]的错误值,则取零作为fromIndex

随后,将找到的index递增并存储在this[bb]中。

至少,会返回索引。

var a = [2, 2, 3, 0, 6],
    b = [6, 3, 2, 2, 0],
    c = b.map(function (bb) {
        var index = a.indexOf(bb, this[bb] || 0);
        if (index !== -1) {
            this[bb] = index + 1;
        }				
        return index;
    }, Object.create(null));
console.log(c);

另一种解决方案可以是首先生成具有a的所有索引的对象,并在b的迭代中使用它来返回索引。

这个例子有点扩展,以显示如果不超过两个索引(2)和一个不在a(7)中会发生什么。

具有a:所有索引的aObj的内容

{
    "0": [3],
    "2": [0, 1],
    "3": [2],
    "6": [4]
}

var a = [2, 2, 3, 0, 6],
    b = [6, 3, 2, 2, 0, 7, 2],
    aObj = Object.create(null),
    c;
a.forEach(function (aa, i) {
    aObj[aa] = aObj[aa] || [];
    aObj[aa].push(i);
});
c = b.map(function (bb) {
    return aObj[bb] && aObj[bb].length ? aObj[bb].shift() : -1;
});
console.log(c);

据我所知,你可以试试这个:

var a = [2,2,3,0,6];
var b = [6,3,2,2,0];
var c = new Array();
for(i = 0; i < b.length; i++)
{
    for(j = 0; j < a.length; j++)
    {  
        if(b[i] === a[j] && c.indexOf(j) < 0)
        {
             c.push(j);
             break;
        }
    }
}
console.log(c); // [4, 2, 0, 1, 3]

FIDDLE演示此处

如果我理解正确。

let c = a.map(i => b.indexOf(i))

var c = a.map(function(i) { return b.indexOf(i); });

循环.map函数并通过indexOf 检查相同值

indexOf将返回一个数字,表示指定搜索值第一次出现的位置,如果从未出现,则返回-1

var arr = [];    
a.map(function(v){      
    if(b.indexOf(v) > -1){
        arr.push(v);
    }
});
console.log(arr);

尝试类似的东西

var a = [2,2,3,0,6];
var b = [6,3,2,2,0];
var arrayLength_a = a.length;
var arrayLength_b = b.length;
var new_array=[];
 for (var i = 0; i < arrayLength_a; i++)
 {
    for (var j = 0; j < arrayLength_b; j++) 
    {
       if (a[i] == b[j]) 
       {
          if(new_array.indexOf(a[i]) === -1)
          {  
             new_array.push(a[i]);
          }
       }     
    }
 }