JS 如果有两个以上的重复项,则查找数组中重复值的索引

问题描述 投票:0回答:6

我正在创建坐标平面三个连续游戏所以我必须找出数组中是否有三个相同值的数字但没有排序数组因为数组表示添加到坐标平面的点的 x 坐标在比赛中... 例如,假设我在坐标平面上添加了 6 个点,x 坐标存储在下一个数组中:

var arr = [2,2,3,2,7,3];

我需要一个只计算值 2 出现次数的循环,因为数字 2 在数组中出现了 3 次,所以输出应该是一个新数组(例如名为索引的数组),其中包含 nmb 2 次出现的确切索引 arr ...

indices = [0,1,3]

如果某个值的出现次数小于 3,那么当到达 arr 的末尾时,循环应该“重置”...

我试过下一个代码,但它不像我上面描述的那样工作,因为它也计算数字 3 的出现次数......所以,如果值计数是,它不会“重置”少于 2...

var arr = [2,2,3,2,7,3];
var index = [];
var count = 0;
var current;
for(var i = 0;i<arr.length;i++){
    current = arr[i];
    //-------------------------------
    for(var j=i+1;j<arr.length;j++){
        if(arr[j]===current){
            count++;
            index.push(j);
            //+++++++++++
            if(j===arr.length-1){
                if(count<2){
                    count = 0;
                    index = [];
                    i++;
                }
                else{
                    index.unshift(i);
                    break;
                }
            }
            //+++++++++++
        }
    }
    //-------------------------------
}
alert(index);

感谢任何帮助或建议...

亚历山大

javascript arrays for-loop duplicates
6个回答
8
投票

我会这样做

  
var arr = [2,2,3,2,7,3];

var indices = [];

arr.filter(function(yourArray, index) {
 if(yourArray == 2){
   indices.push(index)
 }
});
console.log(indices)
如果您打印索引,它将包含此输出 [0,1,3]

如果你想检查是否有两个以上的重复项,你可以这样做

  

var arr = [2,2,3,2,7,3];
var counts = arr.filter(function(yourArr,index, self){
  return !self.indexOf(yourArr) 
});

var indices = [];

arr.filter(function(yourArr, index, self){
  if(yourArr == 2 && counts.length > 2){
   indices.push(index)
 }
})
console.log(indices)


3
投票

是的,使用一些逻辑...

var arr = [2, 2, 3, 2, 7, 3];

function showDupPos(arr, mindups) {
  mindups = mindups || 2;
  var result = [];
  var positions = {};
  // collect all positions
  arr.forEach(function(value, pos) {
    positions[value] = positions[value] || [];
    positions[value].push(pos);
  });
  //check how much of same value in string
  Object.keys(positions).forEach(function(value) {
    var posArray = positions[value];
    if (posArray.length > mindups) {
      result = result.concat(posArray);
    }
  });
  return result.sort();
}
console.log(showDupPos(arr));


1
投票

这是我的解决方案.

var arr = [2,2,3,2,7,3];

var dictionary = {};
for(var i=0;i<arr.length;i++){
  if(dictionary[arr[i]]){
    dictionary[arr[i]]++;
  }else{
    dictionary[arr[i]] = 1;
  }
}

for(var num in dictionary){
  if(dictionary[num] == 3){
    alert(num);
  }
}

1
投票

这里是一个返回重复元素索引数组的函数

let letters = ["b","a","f","g","h","v","s","e","a","t","h","d","z","r", "a", "f" ]
function duplicateIndexes(arr, el){

    duplicate = [];
    for (let i = 0; i < arr.length; i++){
        if (arr[i] == el){
            duplicate.push(i)
        } 
    }
    return duplicate
}
let d = duplicateIndexes(letters, "a")
console.log(d)


1
投票

如果你想要这样的东西:

Input:
array = ["same", "same", "duo", "same", "duo", "lonely", "same"];

Output:
indices = {
    "same": [0, 1, 3, 6],
    "duo": [2, 4],
    "lonely": [5]
}

试试这个代码

let array = ["same", "same", "duo", "same", "duo", "lonely", "same"];
let indices = {};

for (let i = 0; i < array.length; i++) {
    if (!indices[array[i]]) {
        indices[array[i]] = [];
    }
    indices[array[i]].push(i);
}

console.log(indices);

0
投票

你可以使用过滤或减少得到想要的结果。

使用过滤器的方法 -

    const arr = [2,2,3,2,7,3];
    var keys = [];
    var filtered = arr.filter((e, i) => {
    if (e === 2) {
        keys.push(i);
    }
    });
    console.log(keys);

使用减少

    const arr = [2,2,3,2,7,3];

    const indexes = arr.reduce((r, n, i) => {
    n === 2 && r.push(i);
    
    return r;
    }, []);

    console.log(indexes);

可以将此逻辑包装在一个函数中以获得所需的结果,而无需在不同的地方重复代码。

© www.soinside.com 2019 - 2024. All rights reserved.