Javascript 删除有序数组中的重复项

Javascript 删除有序数组中的重复项,javascript,arrays,sorting,duplicates,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]] = lastInde

我要做的是找出一个数组元素在数组中重复自己的次数,将元素和它在对象中的重复次数一起推,然后删除元素及其所有重复项

目前我有这个功能:

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 ]);
函数getDuplicates(arr){ 设lastIndex=null; 设obj={}; for(设i=0;i 哪些日志:
{'1':4,'2':2,'3':4,'5':5}

它对前3个数字(1、2和3)非常有效,但由于lastIndex+1,4没有显示,5混乱,6没有显示。我是否遗漏了什么,或者有没有更好的方法


谢谢。

这里有一个解决方法

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

函数getDuplicates(arr){ var筛选=[…新集合(arr)], 结果={}; 过滤的.forEach(函数(v){ 结果[v]=arr.filter(c=>c==v).length; }) 控制台日志(结果); }
getDuplicates([1,1,1,1,2,2,3,3,3,4,4,5,5,6])您可以简化很多逻辑。只有一个要计数的对象和一个if语句来增加值,如果没有定义,则定义为1

函数计数重复(arr){
//包含一对值和一个实例。
变量计数={};
//迭代数组:检查是否已计数。如果是,则递增,如果不是,则定义为1。
对于(arr的el)(计数[el])?计数[el]+:计数[el]=1;
控制台日志(计数);
返回计数;
}

重复计数([1,1,1,1,2,2,3,3,3,4,4,5,5,6])看起来您似乎想计算重复项,但如果您只想按照@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]

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

getDuplicates([1,1,1,1,2,2,3,3,3,4,4,5,5,6]);
函数getDuplicates(arr){
var obj=arr.reduce((映射,项)=>(映射[项]=++映射[项]| 1,映射),{});
var without DUP=arr.filter((项目,位置)=>arr.indexOf(项目)==pos);
log(JSON.stringify(obj));
log(JSON.stringify(withoutDup));

}
您可以根据需要进行计数和打印,如下所示:

function getDuplicates(arr) {
    var counts = {};
    arr.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
    console.log(counts);
}
函数getDuplicates(arr){ 设lastNum=null; 设obj={}; for(设i=0;i
试试这个:

函数getDuplicates(){ var numbers=Array.prototype.slice.call(参数); var duplicates={}; 对于(数值形式的var指数){ if(numbers.indexOf(numbers[index])==index) 继续; 重复的[数字[索引]=(重复的[数字[索引])| | 0)+1; } 返回副本; } 日志(getDuplicates(1,2,3,1,1,3,4,5,6,7,8,6)); /* 印刷品{ 1: 2, 3: 1, 6: 1 }
*/
您只需创建一个新数组并推送唯一元素即可。您是否先在谷歌上搜索答案?stackoverflow有很多解决方案。可能重复“查找数组元素在数组中重复的次数,将元素与其重复的次数一起推送”@Andreas“删除有序数组中的重复项”。我喜欢函数背后的逻辑,但我不理解(el of arr)的
语法(计数[el])?计数[el]+:counting[el]=1;
。你能用基本的javascript解释一下吗?明白了,它是这样的:
(让i=0;i
正确!混合你的结构和我的名字:
(让i=0;i
我这样做是为了使代码变小:)有趣的是,如果我使用未排序的数组,它仍然具有相同的结果。你能解释一下为什么它把对象键按顺序排列(从最小到最大)?那是因为我们使用数字作为索引。因此,顺序总是0,1,2。。。即使您将它们转换为字符串,它也会考虑数字并对索引进行排序。但是,如果您尝试:
countreplicates(['b','c','a']),它不会订购它们。如果你想让它们按外观顺序排列并保持代码简单,你可以在el的开头加上n:
for(el of arr){el='n'+el;(counting[el])?counting[el]++:counting[el]=1;}
但是你会有n5,而不是5等等。我很感激这个答案,不过我正在寻找更多的“编程”不太使用js内置方法的解决方案。@TudorApostol您想学习js吗?如果是这样,请慢慢检查我的答案并学习。这些函数是纯javascript中内置的。如果不了解他们,你就不会擅长JS。所以学习吧,兄弟,学习!
function getDuplicates(arr) {
    var counts = {};
    arr.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
    console.log(counts);
}
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);
}