【问题标题】:JS Find indices of duplicate values in array if there are more than two duplicates如果有两个以上重复,JS在数组中查找重复值的索引
【发布时间】:2016-11-26 18:05:24
【问题描述】:

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

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

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

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


    【解决方案1】:

    我会喜欢这种方式

      
    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)

    【讨论】:

    • 我认为 OP 不需要只检查 2 个,我认为 var arr = [2,2,3,2,7,3,3]; 应该是 [0, 1, 2, 3, 5, 6]
    • 感谢您的努力和建议,但与之前的评论一样,我不需要循环仅针对某个特定值/数字,但我需要循环遍历数组并且如果出现某个(未预定义)值3 次或 3 次以上,输出数组应包含该值在原始数组中出现的索引...
    • 这就是它的工作原理。您可以将代码包装到函数中并提供您想要的任何值。
    • 谢谢!但是,如果有一个预定义的值应该计算其出现次数,那就太好了,而且容易得多……但该值取决于 arr 中出现次数的 nmb - 在一次中出现 3 次或更多次的数字的值我需要 arr 中的索引...所以循环中没有预定义的值...
    • 如果 (counts.length >2 &&yourArray ==counts[0]){ indices.push (index)} 计数数组包含相同的值,你可以这样做,所以你可以匹配你的索引 0 处的值。
    【解决方案2】:

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

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

    【讨论】:

    • zb' 我刚刚运行了代码 sn-p,它运行良好!不幸的是,我从来没有在这里发过帖子,所以我不知道如何喜欢你的回答或类似的东西......
    • 我真的很愚蠢,我不小心点击了除了你的答案之外的向下箭头,所以现在除了我的帖子之外还有-1,正如我之前提到的,我从来没有在这里发布过,现在我不知道如何撤消此操作??之后,我多次单击向上箭头,但没有任何反应...对不起对不起...
    • 一段时间后点击
    【解决方案3】:

    this is my solution.

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

    【讨论】:

    • 感谢您的建议!我已经尝试过使用 key=>value 数组,输出是出现次数,但我需要原始数组中这些出现的索引...
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多