如何获取javascript数组中重复项的索引?
我有一个排序数组,如下所示:如何获取javascript数组中重复项的索引?,javascript,arrays,Javascript,Arrays,我有一个排序数组,如下所示: var a= [ {id:"1", name:"A", address:"A"}, {id:"2", name:"A", address:"B"}, {id:"3", name:"A", address:"C"}, {id:"4", name:"B", address:"A"}, {id:"5", name:"B", address:"B"}, {id:"6", name:"C", address:"A"},
var a= [
{id:"1", name:"A", address:"A"},
{id:"2", name:"A", address:"B"},
{id:"3", name:"A", address:"C"},
{id:"4", name:"B", address:"A"},
{id:"5", name:"B", address:"B"},
{id:"6", name:"C", address:"A"},
{id:"7", name:"C", address:"B"},
{id:"8", name:"C", address:"C"},..
我想做的是得到那些重复的“名字”的索引,比如
index 0-2 => "A";
index 3-4 => "B";
index 5-7 => "C";
或者甚至计算这些重复项也可以,例如A为3
,B为2
,C为3
var counter = 0;
var prev = "";
var next = "";
var prevLink = a[0].name;
for (var i = 0; i < a.length; i++) {
if(i >= ssRow.length){
//do nothing
}else{
next = a[i+1].name;
}
if(prev== next){
counter++;
}else{
counter = 0;
prevLink = a[i].name;
}
//play with counter variable
}
var计数器=0;
var prev=“”;
var next=“”;
var prevLink=a[0]。名称;
对于(var i=0;i=ssRow.length){
//无所事事
}否则{
next=a[i+1]。名称;
}
如果(上一个==下一个){
计数器++;
}否则{
计数器=0;
prevLink=a[i]。名称;
}
//玩计数器变量
}
但它并没有像预期的那样工作。有更好的方法或更有效的方法吗?您可以简单地使用
filter
方法并结合forEach
来做更多的事情
第一步是从数组中找出唯一的
名称。这可以使用ES6
中的Set
方法实现
var names=[...new Set(array.map(a=>a.name))];
或
更新
names=array.map(a=>a.name).filter(function (x, i, a) {
return a.indexOf(x) == i;
});
然后,您应该使用filter
方法,该方法接受callback
提供的函数,以便从names
数组中获取name
等于一个元素的项
var数组=[
{id:“1”,姓名:“A”,地址:“A”},
{id:“2”,姓名:“A”,地址:“B”},
{id:“3”,姓名:“A”,地址:“C”},
{id:“4”,姓名:“B”,地址:“A”},
{id:“5”,姓名:“B”,地址:“B”},
{id:“6”,姓名:“C”,地址:“A”},
{id:“7”,姓名:“C”,地址:“B”},
{id:“8”,姓名:“C”,地址:“C”}];
var name=[…新集合(array.map(a=>a.name));
名称.forEach(函数(项){
索引=array.map(函数(项,i){
项目[“索引”]=i;
退货项目;
})
.filter(a=>a.name==item)
.map(a=>a.index);
log(索引[0]+'-'+索引[indexes.length-1]+'->'+项+',计数='+索引.length);
});代码>您可以使用reduce()
返回对象作为结果,并为每个名称提供计数和开始-结束索引
var arr=[{“id”:“1”,“name”:“A”,“address”:“A”},{“id”:“2”,“name”:“A”,“address”:“B”},{“id”:“3”,“name”:“A”,“address”:“C”},{“id”:“4”,“name”:“B”,“address”:“A”},{“id”:“5”,“name”:“B”,“address”:“B”;“B”;{“id”:“6”,“name”:“C”,“address”:“A”;{“id”:“7”,“name”:“C”,“address”:“A”;“address”:“B”;“address”:“B”;“id”;“8”,“C”;“address”:“C”
var l=null;
var结果=arr.REDUCT(函数(r,e,i){
如果(!r[e.name]){
l=e.名称;
r[e.name]={
计数:1,
索引:i.toString()
}
}否则{
if(arr[i+1]&&arr[i+1].name!=l | | |!arr[i+1])r[e.name].index+='-'+i;
r[e.name]。计数++
}
返回r;
}, {})
console.log(result)
要计算重复项,可以使用名为\uu.groupBy()
的方法。它为您提供了一个键值对对象,其中键是要检查重复的值,值是具有该键的对象数组。是这样的——
var groupedData = _.groupBy(array, function(elem){
return elem.name; //here you can specify whichever key you want to check duplicates for
});
console.log(groupedData['A'].length);
如果名称不相同或在第一个索引处,可以使用并检查前置项,然后使用索引信息创建一个新数组
var data=[{id:“1”,name:“A”,address:“A”},{id:“2”,name:“A”,address:“A”,address:“C”},{id:“4”,name:“B”,address:“A”},{id:“5”,name:“B”,address:“B”,address:“B”{id:“C”,address:“A”{id:“7”,name:“C”,address:“B”{id:“8”,name:“C”,address:“C”,
组=数据.reduce(函数(r、a、i、aa){
(!i | | aa[i-1].name!==a.name)和&r.push([i,i,a.name]);
r[r.length-1][1]=i;
返回r;
}, []);
控制台日志(组)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以尝试使用下划线中的groupBy
方法。它并没有完成格式化的全部工作,但会让你找到一个好地方继续进行
var data=[{id:“1”,name:“A”,address:“A”},{id:“2”,name:“A”,address:“A”,address:“C”},{id:“4”,name:“B”,address:“A”},{id:“5”,name:“B”,address:“B”,address:“B”{id:“C”,address:“A”{id:“7”,name:“C”,address:“B”{id:“8”,name:“C”,address:“C”,
groups=u.groupBy(数据,'name');
控制台日志(组)代码>
。作为控制台包装{最大高度:100%!重要;顶部:0;}
您可以使用ES6
方法
试试这个,它会按照您的期望工作:
var a=[
{id:“1”,姓名:“A”,地址:“A”},
{id:“2”,姓名:“A”,地址:“B”},
{id:“3”,姓名:“A”,地址:“C”},
{id:“4”,姓名:“B”,地址:“A”},
{id:“5”,姓名:“B”,地址:“B”},
{id:“6”,姓名:“C”,地址:“A”},
{id:“7”,姓名:“C”,地址:“B”},
{id:“8”,姓名:“C”,地址:“C”}];
//将所有name属性值提取到数组中。
var nameArr=Array.from(a,x=>x.name);
var obj={};
对于(变量i=0;i“+i+”);
}
@silentcoder14,对你有用吗?你查过我的答案了吗?我希望它能按照您的期望工作。array.forEach((item,index)=>{dups[item.name]=dups[item.name]| |[];dups[item.name].push(index);});这可以在正常的for循环中完成吗?@silent_coder14,是的,您应该使用for
语句thanx。。另外,这一行的意思是:dups[item.name]=dups[item.name]| |[];这一行的意思如下:如果复制[item.name]
未定义
let dupes = {};
const array= [
{id:"1", name:"A", address:"A"},
{id:"2", name:"A", address:"B"},
{id:"3", name:"A", address:"C"},
{id:"4", name:"B", address:"A"},
{id:"5", name:"B", address:"B"},
{id:"6", name:"C", address:"A"},
{id:"7", name:"C", address:"B"},
{id:"8", name:"C", address:"C"}];
array.forEach((item,index) => {
dupes[item.name] = dupes[item.name] || [];
dupes[item.name].push(index);
});
for(let name in dupes) console.log(name+'->indexes->'+dupes[name]+'->count->'+dupes[name].length)