【问题标题】:get List of values exist more than once in array [duplicate]获取数组中多次存在的值列表[重复]
【发布时间】:2017-11-15 02:37:53
【问题描述】:

我必须获取在数组中多次存在的值列表。 这是当前代码,但正如您所见,它太复杂了。

var arr = [1, 2, 3, 4, 2, 3];
var flag = {}
var exist2arr = [];

for(var i = 0; i < arr.length; i++){
  for(var j = 0 ; j < arr.length; j ++){
     if(i !=j && arr[i] == arr[j]){
       if(!flag[arr[i]])
         exist2arr.push(arr[i]);
       flag[arr[i]] = 1;
     }
  }
}
console.log(exist2arr);

有没有其他方法(使用javascript内置函数的简单代码)来实现这一点?任何形式的帮助表示赞赏。

【问题讨论】:

  • 如果“存在两次以上”的意思是“存在多次”,那么您可以从 for (var i = 0; i &lt; arr.length; i++) { if (arr.indexOf(arr[i]) !== i) { }} 之类的内容开始
  • 抱歉英语不好,我的意思是&gt;1
  • @Hamms,不要忘记 indexOf() 可能返回 -1,它也不等于当前数组索引。
  • @codemaker 假设arr.indexOf(arr[0 &lt;= i &lt; arr.length]) 总是 >= 0
  • 哎呀,我的坏@Hamm...忽略了那部分。对不起。

标签: javascript arrays loops


【解决方案1】:

您可以根据第一个和当前索引不相等的值过滤数组,然后通过Set 运行该数组

const arr = [1, 2, 3, 4, 2, 3, 2, 3, 2, 3, 2, 3]; // added in some extras

const filtered = arr.filter((v, i) => arr.indexOf(v) !== i)
const unique = new Set(filtered)

console.info(Array.from(unique)) // using Array.from so it can be logged

【讨论】:

  • 谢谢@Phil,很好的建议。
  • @HerrGanzorig 我对大 O 表示法很糟糕,但我认为过滤器具有 O(N^2) 复杂度,可能会得到改进
【解决方案2】:

var arr = [1, 2, 3, 4, 2, 3];

var o = arr.reduce((o, n) => {
  n in o ? o[n] += 1 : o[n] = 1;
  return o;
}, {});

var res = Object.keys(o).filter(k => o[k] > 1);

console.log(res);

【讨论】:

  • 比 phil 的稍微复杂,但可以扩展找到 >2。谢谢,
  • 不客气!
  • 您需要将键转换为数字。
【解决方案3】:

有点hacky,但是很短并且O(n):

var arr = [1, 2, 3, 4, 2, 3, 2, 2]

var a = arr.reduce((r, v) => ((r[v + .1] = r[v + .1] + 1 || 1) - 2 || r.push(v), r), [])

console.log( a )              // [2,3]
console.log({ ...a })         // to show the "hidden" items
console.log({ ...a.slice() }) // .slice() can be used to remove the extra items

【讨论】:

    【解决方案4】:

    可以这样做:

    function timesInArray(v, a){
      var n = 0;
      for(var i=0,l=a.length; i<l; i++){
        if(a[i] === v){
          n++;
        }
      }
      return n;
    }
    function dups(dupArray, num){
      var n = num === undefined ? 2 : num;
      var r = [];
      for(var i=0,d,l=dupArray.length; i<l; i++){
        d = dupArray[i];
        if(!timesInArray(d, r) && timesInArray(d, dupArray) >= n){
          r.push(d);
        }
      }
      return r;
    }
    var testArray = [4, 5, 2, 5, 7, 7, 2, 1, 3, 7, 7, 7, 25, 77, 4, 2];
    console.log(dups(testArray)); console.log(dups(testArray, 3));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多