JavaScript:比较两个数组并返回匹配的索引

JavaScript:比较两个数组并返回匹配的索引,javascript,arrays,Javascript,Arrays,我有以下代码 function findMatch(array_1_small, array2_large) { var ary = new Array(); for(i = 0;i < array2_large.length; i++) { for(z = 0; z < array_1_small.length; z++) { if(array2_large[i] == array_1_small[z]) { var idx = array2_la

我有以下代码

function findMatch(array_1_small, array2_large) {
var ary = new Array();
for(i = 0;i < array2_large.length; i++)
{
  for(z = 0; z < array_1_small.length; z++)
  {
    if(array2_large[i] == array_1_small[z])
    {
     var idx = array2_large.indexOf(array2_large[i]);
      ary.push(idx);
    }
  }

}
return ary;
}
唯一的目的是找到匹配项并返回“all_form_numbers数组”上匹配项的索引

关于调用代码

var a = findMatch(all_SMS_TO, all_FORM_NUMBERS);
console.log("Match Found " + a);
我得到以下输出

Match Found: 6
Match Found: 1,1
这是正确的,但是当我将all_form_Numbers数组更改为

var all_FORM_NUMBERS = ["", "0871355066", "", "", "", "", "0871355066",""];
我得到以下输出

Match Found: 6
Match Found: 1,1
有人能帮我吗,这样它就可以输出了

Match Found 1, 6.
谢谢。

当你这么做的时候

var idx = array2_large.indexOf(array2_large[i]);
您在数组array2_large中搜索值0871355066的索引两次,根据indexOf的定义,它将返回指定值的第一次出现的位置

这就是为什么自索引第一次出现以来,您两次获得索引值1的原因

对于解决方案,只需将变量i值推入数组ary。这已经是循环中array2_large的索引值

函数findMatch(数组1\u小,数组2\u大){
var ary=新数组();
对于(i=0;i控制台日志(“找到匹配项”+a)
您只需推送索引
i
这是固定代码(您还可以将数组声明为
var res=[];

function findMatch(arraySmall, arrayLarge) {
  var res = []
  for (var i = 0; i < arrayLarge.length; i++) {
    for (var j = 0; j < arraySmall.length; j++) {
      if (arrayLarge[i] === arraySmall[j]) {
        res.push(i);
      }
    }
  }
  return res;
}
函数findMatch(ArraySall,ArraySlarge){
var res=[]
对于(var i=0;i
试试这个:

function findMatch(array_1_small, array2_large) {
var ary = new Array();
for(i = 0;i < array2_large.length; i++)
{
  for(z = 0; z < array_1_small.length; z++)
  {
    if(array2_large[i] == array_1_small[z])
    {
      ary.push(i);
    }
  }

}
return ary;
}
函数findMatch(数组1\u小,数组2\u大){
var ary=新数组();
对于(i=0;i
通过首先创建位置查找表,可以解决O(n+m)运行时复杂性的问题。然后将第一个数组中的每个元素映射到所有位置,并将这些索引收集到一个集合中,只留下唯一的值

试试这个:

var all_SMS_TO=[“0861932936”、“0871355066”、“0874132026”、“0872908445”、“0874132026”];
变量所有形式的数字=[,“0871355066”,“,,,,,,,,,,“0871355066”,“,”];
函数findMatch(数组大小为1,数组大小为2){
var positions=Array.from(array2_large.entries()).reduce((acc,t)=>{
var指数=t[0]
var元素=t[1]
如果(!acc.hasOwnProperty(元素)){
acc[元素]=[]
}
acc[元素].推送(索引)
返回acc
}, {})
var结果=新集合()
数组_1_small.forEach(x=>{
if(位置[x]==未定义){
返回
}
位置[x].forEach(索引=>result.add(索引))
})
返回数组.from(结果)
}

console.log(“找到的匹配项:+findMatch(所有短信号码,所有表单号码))
不是索引吗?
ari.push(i)
。IndexOf将执行另一个O(n)搜索并返回它找到的第一个索引,这在您的案例中是不需要的,因为您已经知道了索引。变量
i
z
的可能重复应该用
let
var
var a=all\u FORM\u NUMBERS.map((n,i)=>all\u SMS\u TO.includes(n)?i:-1)声明。过滤器(n=>n!=-1)
这里有非常聪明的想法,尤其是地图!谢谢。谢谢你,它起了作用,让我省去了一个头疼的问题!:)