javascript中对象数组中键的重复数据消除和最大值行获取

javascript中对象数组中键的重复数据消除和最大值行获取,javascript,angularjs,Javascript,Angularjs,我有一个对象数组。此数组有重复的行。需要识别其中一个键具有最大值的重复数据消除行。请不要忘记,它已经是按id排序的 var myArray = [ {id: 1, name: 'Foo Bar', email: 'foo@bar.com'}, {id: 2, name: 'Foo Bar', email: 'foo@bar.com'}, {id: 3, name: 'Foo Bar', email: 'foo@bar.com'}, {id: 1, name: 'Jenny Blo

我有一个对象数组。此数组有重复的行。需要识别其中一个键具有最大值的重复数据消除行。请不要忘记,它已经是按id排序的

var myArray = [
  {id: 1, name: 'Foo Bar', email: 'foo@bar.com'},
  {id: 2, name: 'Foo Bar', email: 'foo@bar.com'},
  {id: 3, name: 'Foo Bar', email: 'foo@bar.com'},
  {id: 1, name: 'Jenny Block', email: 'jenny@bar.com'},
  {id: 2, name: 'Jenny Block', email: 'jenny@bar.com'},
];
这是对象的示例数组。我需要得到以下输出

var myArray = [  
  {id: 3, name: 'Foo Bar', email: 'foo@bar.com'},
  {id: 2, name: 'Jenny Block', email: 'jenny@bar.com'},
];



for (var i = 0; i < myArray.length; i++) {
    for (var j = i + 1; j < myArray.length; j++) {
        if (myArray[i].name === myArray[j].name && myArray[i].email === myArray[j].email) {
            myArray.splice(j,1);
        }
    }
}
var myArray=[
{id:3,姓名:'foobar',电子邮件:'foo@bar.com'},
{id:2,姓名:'Jenny Block',电子邮件:'jenny@bar.com'},
];
对于(var i=0;i

该代码仅在有2个重复项时有效。我想要一个可以处理2个以上重复项的行,并且只包含最大id的行。您可以在累加器中搜索相同的名称和电子邮件,如果找不到,则推送;如果
id
较小,则更新

var数组=[{id:1,名称:'foobar',电子邮件:'foo@bar.com“},{id:2,名称:'foobar',电子邮件:'foo@bar.com“},{id:3,名称:'foobar',电子邮件:'foo@bar.com“},{id:1,姓名:'Jenny Block',电子邮件:'jenny@bar.com“},{id:2,姓名:'Jenny Block',电子邮件:'jenny@bar.com' }],
结果=数组。减少((r,o)=>{
var index=r.findIndex(p=>o.name==p.name&&o.email==p.email);
如果(索引==-1){
r、 推(o);
返回r;
}
if(r[index].id

作为控制台包装{max height:100%!important;top:0;}
它的行为是这样的,因为
myArray.splice
减少了初始数组的长度,并且可能会跳过某些索引。为了避免这种情况,您可以从数组的末尾到开头进行迭代,并在执行
splice
操作后立即执行
i--
,这将有助于保持正确的迭代顺序。所提供的数组已按id按升序排序(我指的是那些具有相同
名称
电子邮件
)的对象),这样您将获得id最高的唯一对象:

var myArray=[
{id:1,名称:'foobar',电子邮件:'foo@bar.com'},
{id:2,姓名:'foobar',电子邮件:'foo@bar.com'},
{id:3,姓名:'foobar',电子邮件:'foo@bar.com'},
{id:1,姓名:'Jenny Block',电子邮件:'jenny@bar.com'},
{id:2,姓名:'Jenny Block',电子邮件:'jenny@bar.com'},
];
对于(var i=myArray.length-1;i>=0;i--){
对于(var j=i-1;j>=0;j--){
if(myArray[i].name==myArray[j].name&&myArray[i].email==myArray[j].email){
myArray.剪接(j,1);
我--;
}
}
}
log(myArray)
var maxId=0;
重复变量=[];
var newArray=[];
对于(var i=0;imaxId){
maxId=myArray[j].id;
重复。按[j];
}  
}
}
myArray[i].id=maxId;
push(myArray[i]);
}

对于这类问题,这里有一个从通用函数开始的方法:通过接受两个函数来重复值列表,一个函数为匹配的值生成一个键,另一个函数选择要保留的匹配值对

我们可以为密钥生成提供类似于
({name,email})=>`${name}~${email}`
,但我选择在
JSON.stringify
上使用
id
之外的所有内容,因为它看起来更灵活。选择正确的匹配项就是
(a,b)=>a.id>b.id?a:b

const deplicate=(genKey,choose)=>xs=>Object.values(xs.reduce((acc,x)=>{
const key=genKey(x)
acc[键]=acc[键]?选择(acc[键],x):x
返回acc
}, {}))
const keepHighestId=重复数据消除(
({id,…rest})=>JSON.stringify(rest),
(a,b)=>a.id>b.id?a:b
)
常量myArray=[{“电子邮件”:foo@bar.com,“id”:1,“name”:“Foo Bar”},{“email”:foo@bar.com,“id”:2,“name”:“Foo Bar”},{“email”:foo@bar.com,“id”:3,“name”:“Foo Bar”},{“email”:jenny@bar.com,“id”:1,“姓名”:“Jenny Block”},{“电子邮件”:jenny@bar.com,“id”:2,“名称”:“Jenny Block”}]

console.log(keepHighestId(myArray))
您是否需要将
id
id
的最大值等于
1
的项目保留在原位?对不起,我不明白,但如果您问我是否需要保留原始订单。是的,我需要保留它。您需要保留匹配的最后一个(按数组顺序)还是id最高的?id最高的。
var maxId = 0;
var duplicates = [];
var newArray = [];
for (var i = 0; i < myArray.length-1; i++) {
    maxId = myArray[i].id;
    if(!duplicates.includes(i)) {
        for (var j = i+1; j < myArray.length; j++) {  
            if (myArray[j].id > maxId) {
                maxId = myArray[j].id; 
                duplicates.push[j]; 
            }  
        }
    }
    myArray[i].id = maxId;
    newArray.push(myArray[i]);
}