Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取javascript数组中重复项的索引?_Javascript_Arrays - Fatal编程技术网

如何获取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)