在javascript中使用重复值搜索两个数组中的匹配值

时间:2016-05-19 09:56:19

标签: javascript arrays

我有两个数组:

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

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

5 个答案:

答案 0 :(得分:1)

这是一个尊重最后一个索引并进一步展望的提案。

  

工作原理:

     

它使用Array#map通过回调迭代数组b。 map获取一个自己的this空格,其中包含一个非常空的对象Object.create(null)

     

回调有参数bb,它是`b。

的一个元素      

接下来是根据以前的搜索,找到包含Array#indexOfa的数组fromIndex中的元素。前一个索引存储在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)中会发生什么。

  

aObj的内容,所有索引均为a

{
    "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);




答案 1 :(得分:0)

如果我理解正确的话。

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

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

答案 2 :(得分:0)

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

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 DEMO HERE

答案 3 :(得分:0)

循环.map函数,并按indexOf

检查相同的值
  

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

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

答案 4 :(得分:0)

尝试这样的事情

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]);
          }
       }     
    }
 }