在JavaScript中查找数组中重复项的索引

6
我有两个数组: arr1=[ 0, 1, 2, 0, 2 ]; arr2=[ 0, 0, 1, 2, 2 ];
我需要从arr1中找到arr2元素的索引,并输出如下格式的数组[0,3,1,2,4]我已经编写了一段代码,但它只适用于没有重复元素的数组。
var index = [];
for (i = 0; i <= arr2.length - 1; i++) {
  index.push(arr1.indexOf(arr2[i]));
}

newiter是什么?我猜它是一个数组,并且从所示代码来看,它是一个一维数组。请将[0]从中删除。 - Tushar
newiter是[0,0,1,2,2],而duplicate是[0,1,2,0,2]。 - user9283073
5个回答

3

您需要在第一个索引后搜索第二个元素,对于所有重复的元素也是如此(对于第三个元素,在索引之后)。您可以在Array#indexOf方法中指定fromIndex参数以从特定索引开始搜索。

// use a reference object to specify from index for duplicate
var ref = {};

var index = [];

for (i = 0; i < arr2.length; i++) {
  // specify from index from object, if not found set as 0
  var i1 = arr1.indexOf(arr2[i], ref[arr2[i]] || 0);

  // push the index
  index.push(i1);

  // specify from index for current element
  ref[arr2[i]] = i1 + 1;
}

var ref = {};

var arr1 = [0, 1, 2, 0, 2],
  arr2 = [0, 0, 1, 2, 2];


var ref = {};

var index = [];

for (i = 0; i < arr2.length; i++) {
  var i1 = arr1.indexOf(arr2[i], ref[arr2[i]] || 0);
  index.push(i1);
  ref[arr2[i]] = i1 + 1;
}

console.log(index);

使用 Array#map 方法生成索引数组。
var index = arr2.map(function(v, i) {
  // get the index of the element, where specify from index to
  // search after a certain index for repeating element
  var i1 = arr1.indexOf(v, this[v] || 0);

  // set reference of index 
  this[v] = i1 + 1;

  // return index
  return i1;
  // set this argument as an object for from index reference
}, {});

var arr1 = [0, 1, 2, 0, 2],
  arr2 = [0, 0, 1, 2, 2];

var index = arr2.map(function(v, i) {
  var i1 = arr1.indexOf(v, this[v] || 0);
  this[v] = i1 + 1;
  return i1;
}, {});

console.log(index);


0

var arr1 = [ 0, 1, 2, 0, 2 ];
var arr2 = [ 0, 0, 1, 2, 2 ]
var index = [];
var hash = {};
for (i = 0; i < arr2.length; i++) {
  var ind_temp;
  if(arr2[i] in hash){
    //console.log("here");
    ind_temp = arr1.indexOf(arr2[i],hash[arr2[i]] + 1);
    index.push(ind_temp);
    hash[arr2[i]] = ind_temp;
  }
  else{
    ind_temp = arr1.indexOf(arr2[i]);
    index.push(ind_temp);
    hash[arr2[i]] = ind_temp;
  }
}

console.log(index);


0

你可以遍历数组并将其映射到另一个数组,将第一个实例设置为未定义。显然,如果未定义是您想要搜索的值,则此方法无效。

var zz = arr1.map(val => {
  if (!val) return undefined
  let ind = arr2.indexOf(val)
  if (ind) arr2[ind] = undefined
  return ind
})

(如果您无法修改数组2,那么复制它也很容易) - Abid Hasan
if(ind) fails for ind = 0 - Jonas Wilms

0
你可以遍历arr2并将在arr1中找到的索引保存在变量中,如果arr2的元素等于先前的元素,则从保存的索引+1开始比较,为此可以使用indexOf方法的第二个参数。
var duplicate =[ 0, 1, 2, 0, 2 ];
var newiter =[ 0, 0, 1, 2, 2 ];
var indexArray = []; //RESULT ARRAY

var newiter = newiter.sort(); //IN CASE newiter IS NOT SORTED

var i = -1;
for(var j = 0; j<newiter.length; j++) {

  // check if element from newiter is equal to previous , if not set i to -1
  if(j > 0 && newiter[j] != newiter[j-1]) {
    i = -1;
  }

  // get index from duplicate but start searching from i+1
  i = duplicate.indexOf(newiter[j], i+1);
  indexArray.push(i);
}

console.log(indexArray);

0
如果您只有正数,请尝试这个。
var temp = arr1.slice(0); //Clone arr1 to a temp Arr

var index = [];

arr2.forEach(item => {
    let ind = temp.indexOf(item);
    index.push(ind);
    ind > -1 && (temp[ind] = -1);
})

console.log(index);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接