Javascript 删除重复项,如果不是重复项,则更改其值

Javascript 删除重复项,如果不是重复项,则更改其值,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组: [0] [object Object] id: green selectable: false [1] [object Object] id: green selectable: false [2] [object Object] id: red selectable: true 我想做的是 如果阵列包含一个副本(如绿色),请删除该副本并保留其中一个副本 若数组不包含重复项(如“红色”),则保留它并更改其值(“可选”从“真”变为“假”)

我有一个对象数组:

[0] [object Object]
   id: green
   selectable: false
[1] [object Object]
   id: green
   selectable: false
[2] [object Object]
   id: red
   selectable: true
我想做的是

  • 如果阵列包含一个副本(如绿色),请删除该副本并保留其中一个副本
  • 若数组不包含重复项(如“红色”),则保留它并更改其值(“可选”从“真”变为“假”)
谢谢大家!

这就是我迄今为止所尝试的:

function removeDuplicates(originalArray, prop) {
    var newArray = [];
    var lookupObject  = {};
    for(var i in originalArray) {
       lookupObject[originalArray[i][prop]] = originalArray[i];
    }
    for(i in lookupObject) {
        newArray.push(lookupObject[i]);
    }
    return newArray;
}

我可以删除重复项,但找不到编辑“非重复”项的方法。您可以扩展函数,使第二个循环在原始数组上迭代,然后:

  • 如果迭代对象与查找对象中的相同,则表示只遇到一次,因此其可选属性应设置为
    false
    。例如,您可以使用
    Object.assign
    执行此操作

  • 如果迭代对象与查找对象中的对象不同,则表示后面还有另一个具有相同id的对象,因此我们只应添加一次:您可以立即添加它,然后销毁查找对象的相关内容,这样您就不会再次匹配它

下面是它的外观:

功能移除副本(原始阵列,道具){
设newArray=[];
让lookupObject={};
对于(让原数组的对象){
lookupObject[obj[prop]]=obj;
}
对于(让原数组的对象){
让match=lookupObject[obj[prop]];
if(match==obj){//唯一id
push(Object.assign({},obj,{selective:false}));
}else if(match){//第一次出现非唯一id
newArray.push(obj);//只添加一次重复项
lookupObject[obj[prop]]=null;//避免再次添加它。
} 
}
返回新数组;
}
设arr=[{
id:“绿色”,
可选:false
}, {
id:“绿色”,
可选:false
}, {
id:“红色”,
可选:真
}];
let res=移除的副本(arr,“id”);

控制台日志(res)I dom it 2个步骤:首先,我要查找具有两个条目的颜色,然后构建新数组。
使用foreach查看颜色,看是否包含新的cols数组id(颜色)。如果不是的话,就把它推过去。否则,如果新的双数组不存在,则将其推送到新的双数组。
用于浏览颜色数组,如果不是双精度的,则将条目(可选择更改)推送到新的结果数组。如果在新的doubleUsed数组中,请查看double。如果没有,则将其推送到结果,并将id推送到doubleUsed数组。否则什么也不做就继续

let colors=[{id:'green',selective:false},{id:'green',selective:false},{id:'red',selective:true}];
设cols=[];
让双精度=[]
colors.forEach({id})=>{
如果(!列包括(id))
cols.push(id);
如果(!double.includes(id))则为else
双推(id);
});
设doubleUsed=[];
让结果=颜色。减少((acc,cur)=>{
如果(!double.includes(当前id))
acc.push({id:cur.id,可选:false});
如果(!doubleUsed.includes(cur.id)){
acc.push(当前);
双重使用推送(当前id);
}
返回acc;
},[]);

控制台日志(结果)“谢谢”:请稍候。。。我们期待你方的尝试,并说明为什么你无法使其发挥作用。请展示你的努力。谢谢。请编辑您的问题,并将您的代码作为可运行的代码段添加到其中(使用编辑器中的工具栏按钮)。确保它运行并演示该问题。我刚刚更新了它,我只是在寻找像魅力一样的帮助作品!谢谢你的帮助,谢谢@trincot