JavaScript对象数组-基于嵌套对象从数组中删除重复对象

JavaScript对象数组-基于嵌套对象从数组中删除重复对象,javascript,arrays,Javascript,Arrays,我有一个带有嵌套类别对象的对象数组(见下文)。我希望删除重复的对象(基于“objectID”),并创建一个新数组,其中只包含嵌套“hierarchicalCategories”键值对较多的对象 const objectsArray=[ { “objectID”:1234, “等级分类”:{ “10级”:“女子”, “一级”:“女式>衬衫”, “二级”:“女式>衬衫>T恤” } }, { “目标”:5678, “等级分类”:{ “10级”:“男式” } }, { “objectID”:1234,

我有一个带有嵌套类别对象的对象数组(见下文)。我希望删除重复的对象(基于“objectID”),并创建一个新数组,其中只包含嵌套“hierarchicalCategories”键值对较多的对象

const objectsArray=[
{
“objectID”:1234,
“等级分类”:{
“10级”:“女子”,
“一级”:“女式>衬衫”,
“二级”:“女式>衬衫>T恤”
}
},
{
“目标”:5678,
“等级分类”:{
“10级”:“男式”
}
},
{
“objectID”:1234,
“等级分类”:{
“10级”:“女子”
}
},
{
“目标”:5678,
“等级分类”:{
“10级”:“男式”,
“一级”:“男式>鞋”
}
}
]
因此,预期结果如下所示:最终数组将过滤重复项,并保留每个对象的一个实例…objectID:1234实例的“HierarchyCalCategories”达到“lvl2”,objectID:5678实例的“HierarchyCalCategories”达到“lvl1”

const newArray=[
{
“objectID”:1234,
“等级分类”:{
“10级”:“女子”,
“一级”:“女式>衬衫”,
“二级”:“女式>衬衫>T恤”
}
},
{
“目标”:5678,
“等级分类”:{
“10级”:“男式”,
“一级”:“男式>鞋”
}
}
]
我有一个函数,用于基于过滤重复objectID的新数组,但我不确定如何创建逻辑以使对象具有更多的“hierarchicalCategories”键值对

constnewarray=Array.from(新集合(objectsArray.map(a=>a.objectID)))
.map(objectID=>{
返回objectsArray.find(a=>a.objectID==objectID)
})
您可以选择a,并将类别分配给同一组

const
objectsArray=[{objectID:1234,层次分类:{lvl0:“女性”,lvl1:“女性>衬衫”,lvl2:“女性>衬衫>T恤”},{objectID:5678,层次分类:{lvl0:“男性”},{objectID:1234,层次分类:{lvl0:“女性”},{objectID:5678,层次分类:{lvl0:“男性”,lvl1:“男性>鞋”} }],
结果=数组。从(objectsArray)
.减少((m,o)=>{
如果(m.has(o.objectID)){
赋值(m.get(o.objectID.hierarchicalCategories,o.hierarchicalCategories);
返回m;
}
返回m.set(o.objectID,o);
},新地图)
.values()
);
控制台日志(结果)
.as console wrapper{max height:100%!important;top:0;}
使用and从最高级别到最低级别进行排序,并进行筛选,以便新数组中只包含最高级别

const objectsArray=[
{
“objectID”:1234,
“等级分类”:{
“10级”:“女子”,
“一级”:“女式>衬衫”,
“二级”:“女式>衬衫>T恤”
}
},
{
“目标”:5678,
“等级分类”:{
“10级”:“男式”
}
},
{
“objectID”:1234,
“等级分类”:{
“10级”:“女子”
}
},
{
“目标”:5678,
“等级分类”:{
“10级”:“男式”,
“一级”:“男式>鞋”
}
}
]
const newArray=objectsArray.sort((a,b)=>Object.keys(b.hierarchicalCategories.length-Object.keys(a.hierarchicalCategories.length)).filter((v,i,a)=>i==a.findIndex(e=>e.objectID==v.objectID));
log(newArray)
。作为控制台包装器{
最大高度:100%!重要;
排名:0;
}
常量应添加=(项目,目标)=>{
如果(!target[item.objectID])返回true;
if(target[item.objectID]&&&!target[item.objectID].hierarcialCategories&&item.hierarcialCategories)返回true;
if(target[item.objectID]&&target[item.objectID].hierarcialCategories&&item.hierarcialCategories&&Object.keys(target[item.objectID].hierarcialCategories.length{
如果(应添加(对象,新对象数组)){
newObjectsArray[obj.objectID]=obj
}
})
log(Object.values(newObjectsArray))//值(newObjectsArray)应该包含您想要的内容
const objectsArray=[
{
“objectID”:1234,
“等级分类”:{
“10级”:“女子”,
“一级”:“女式>衬衫”,
“二级”:“女式>衬衫>T恤”
}
},
{
“目标”:5678,
“等级分类”:{
“10级”:“男式”
}
},
{
“objectID”:1234,
“等级分类”:{
“10级”:“女子”
}
},
{
“目标”:5678,
“等级分类”:{
“10级”:“男式”,
“一级”:“男式>鞋”
}
}
]
var result\u arr=objectsArray.reduce((acc,curr)=>{
const existing_obj=acc.find(item=>item.objectID==curr.objectID);
如果(现有的_obj){
if(Object.keys(curr.hierarchicalCategories).length>Object.keys(existing_obj.hierarchicalCategories).length)
现有_obj.hierarchicalCategories={…curr.hierarchicalCategories};
}否则{
加速推力(电流);
}
返回acc;
}, []);

console.log(result\u arr)
什么不起作用?请添加您的代码。@NinaScholz我更新了我的答案,以包含一个用于筛选重复objectID的函数,但我不确定如何根据嵌套对象中的“hierarchicalCategories”数量进行筛选
const shouldAdd = (item, target) => {
  if (!target[item.objectID]) return true;
  if (target[item.objectID] && !target[item.objectID].hierarchicalCategories && item.hierarchicalCategories) return true;
  if (target[item.objectID] && target[item.objectID].hierarchicalCategories && item.hierarchicalCategories && Object.keys(target[item.objectID].hierarchicalCategories).length < Object.keys(item.hierarchicalCategories).length) return true;
}

let newObjectsArray = {}
objectsArray.forEach((obj) => {
  if (shouldAdd(obj, newObjectsArray)) {
    newObjectsArray[obj.objectID] = obj
  }
})

console.log(Object.values(newObjectsArray)); //Object.values(newObjectsArray) should contain what you want