删除有序数组中的重复项

时间:2017-03-09 15:19:42

标签: javascript arrays sorting duplicates

我要做的是找出数组元素在数组中重复多少次,将元素与它在对象中重复的次数一起推送,然后删除该元素及其所有重复项。

目前我有这个功能:

function getDuplicates(arr) {
  let lastIndex = null;
  let obj = {};
  for ( let i = 0; i < arr.length; i++ ) {
    lastIndex = arr.lastIndexOf(arr[i]);
    obj[arr[i]] = lastIndex + 1;
    arr.splice(0, lastIndex + 1 );
  }
  console.log(obj);
}

getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);

记录日期:{ '1': 4, '2': 2, '3': 4, '5': 5 }

它适用于前3个数字(1,2和3),但4个没有显示,5个搞砸了,6个因为lastIndex +1而没有显示。我错过了什么或有更好的方法吗?

谢谢。

7 个答案:

答案 0 :(得分:0)

这是一种解决方法。

首先,我使用new Set()从给定数组中删除了所有重复元素,然后使用Array#forEach对其进行迭代,并使用Array#filter检查给定元素出现的次数传递的数组。

&#13;
&#13;
function getDuplicates(arr){
  var filtered = [...new Set(arr)],
      result = {};
      filtered.forEach(function(v){
        result[v] = arr.filter(c => c == v).length;
      })
      console.log(result);
}
    
getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
&#13;
&#13;
&#13;

Array#reduce 解决方案。

&#13;
&#13;
function getDuplicates(arr) {
  var res = arr.reduce(function(s, a) {
    s[a] = arr.filter(c => c == a).length;
    return s;
  }, {});
  console.log(res);
}

getDuplicates([1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6]);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

你可以简化很多逻辑。只是一个要计数的对象和一个if语句来增加值,或者如果它没有被定义则定义为1.

&#13;
&#13;
function countDuplicates(arr) {
  // Contains a pair of values an instances.
  var counting = {};
  // Iterate array: check if already counted. If yes, increment, if not define as 1.
  for (el of arr) (counting[el]) ? counting[el]++ : counting[el] = 1;
  console.log(counting);
  return counting;
}

countDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);
&#13;
&#13;
&#13;

添加,如果您还想获得独特的元素,可以使用E6 set

var set = new Set([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ]);

答案 2 :(得分:0)

看起来好像你要COUNT重复,但如果你想要做的就是删除重复项(如标题状态),按照@ChantryCargill的建议:

function removeDuplicates (arr) {
   var results = [];
   for(var i = 0; i < arr.length; i++) {
      var item = arr[i];
      if(results.indexOf(item) === -1) {
         results.push(item);
      }
   }
   return results;
}

console.log(removeDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ])); 
//[1, 2, 3, 4, 5, 6]

如果你想要COUNT重复:

function getDuplicates(arr) {
   var results = {};
   for(var item of arr) {
      if(!results[item]) {
         results[item] = 0;
      }
      results[item]++;
   }
   return results;
}

console.log(getDuplicates([ 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6 ])); 
//{"1":4,"2":2,"3":4,"4":2,"5":3,"6":1}

答案 3 :(得分:0)

您只需使用Array#reduce()计算出现次数,Array#filter()即可删除重复次数

&#13;
&#13;
getDuplicates([1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 6]);

function getDuplicates(arr) {
  var obj = arr.reduce((map, item) => (map[item] = ++map[item] || 1, map),{} );
  var withoutDup = arr.filter((item, pos) => arr.indexOf(item) == pos);

  console.log(JSON.stringify(obj));
  console.log(JSON.stringify(withoutDup));
}
&#13;
&#13;
&#13;

答案 4 :(得分:0)

您可以按照自己的意愿计算和打印:

function getDuplicates(arr) {
    var counts = {};
    arr.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
    console.log(counts);
}

答案 5 :(得分:0)

function getDuplicates(arr) {
  let lastNum = null;
  let obj = {};
  for ( let i = 0; i < arr.length; i++ ) {
    if (arr[i] != lastNum){
      lastNum = arr[i];
      obj[arr[i]] = 1;
    }else{
      obj[arr[i]]++;
    }
  }
  console.log(obj);
}

答案 6 :(得分:0)

试试这个:

&#13;
&#13;
function getDuplicates(){
  var numbers=Array.prototype.slice.call(arguments);
  var duplicates={};
  for(var index in numbers){
    if(numbers.indexOf(numbers[index])==index)
      continue;
    duplicates[numbers[index]]= (duplicates[numbers[index]] || 0) + 1;
  }
  return duplicates;
}

console.log(getDuplicates(1,2,3,1,1,3,4,5,6,7,8,6));
/*
prints {
  1: 2,
  3: 1,
  6: 1
}
*/
&#13;
&#13;
&#13;