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