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