因此,我正在尝试根据“objectID”从对象数组(见下文)中删除重复项,并在每个级别(lvl0、lvl1、lvl2)合并嵌套的“hierarchicalCategories”,如果它们是唯一的则将其放入数组中。
let objArray = [
{
"objectID": "1234",
"hierarchicalCategories": {
"lvl0": "Women's"
}
},
{
"objectID": "1234",
"hierarchicalCategories": {
"lvl0": "Women's",
"lvl1": "Women's > Jewelry",
"lvl2": "Women's > Jewelry > New"
}
},
{
"objectID": "1234",
"hierarchicalCategories": {
"lvl0": "New",
"lvl1": "New > Jewelry"
}
},
{
"objectID": "5678",
"hierarchicalCategories": {
"lvl0": "Men's",
"lvl1": "Men's > Shoes",
}
},
{
"objectID": "5678",
"hierarchicalCategories": {
"lvl0": "New",
"lvl1": "New > Shoes"
}
}
]
预期结果应该如下所示:每个“objectID”只有一个实例,如果每个层次都有唯一值,则合并“hierarchicalCategories”。
let newArray = [
{
"objectID": "1234",
"hierarchicalCategories": {
"lvl0": ["Women's","New"],
"lvl1": ["Women's > Jewelry","New > Jewelry"],
"lvl2": ["Women's > Jewelry > New"]
}
},
{
"objectID": "5678",
"hierarchicalCategories": {
"lvl0": ["Men's", "New"],
"lvl1": ["Men's > Shoes","New > Shoes"]
}
}
]
这是我使用的代码,它在一定程度上能够运行,但并不完全有效。基本上,在每个级别(lvl0、lvl1、lvl2)中,我都创建了一个数组,只有在之前未包含时才会将其推送进去。但是,如果没有定义级别,例如
"objectID":"5678"
并且在任何重复项中都没有定义"lvl2"
,那么在过滤后的数组中就会有一个空数组槽位,而我不希望出现这种情况,但似乎无法修复它而不完全破坏代码。也可以考虑其他建议和改进代码或其他方法。const filteredArr = objArray.reduce((acc, current) => {
const x = acc.find(item => item.objectID === current.objectID);
if (!x) {
current.hierarchicalCategories.lvl0 ? current.hierarchicalCategories.lvl0 = [current.hierarchicalCategories.lvl0] : current.hierarchicalCategories.lvl0 = []
current.hierarchicalCategories.lvl1 ? current.hierarchicalCategories.lvl1 = [current.hierarchicalCategories.lvl1] : current.hierarchicalCategories.lvl1 = []
current.hierarchicalCategories.lvl2 ? current.hierarchicalCategories.lvl2 = [current.hierarchicalCategories.lvl2] : current.hierarchicalCategories.lvl2 = []
acc.push(current)
} else {
if (current.hierarchicalCategories.lvl0 && !x.hierarchicalCategories.lvl0.includes(current.hierarchicalCategories.lvl0)) {
x.hierarchicalCategories.lvl0.push(current.hierarchicalCategories.lvl0)
}
if (current.hierarchicalCategories.lvl1 && !x.hierarchicalCategories.lvl1.includes(current.hierarchicalCategories.lvl1)) {
x.hierarchicalCategories.lvl1.push(current.hierarchicalCategories.lvl1)
}
if (current.hierarchicalCategories.lvl2 && !x.hierarchicalCategories.lvl2.includes(current.hierarchicalCategories.lvl2)) {
x.hierarchicalCategories.lvl2.push(current.hierarchicalCategories.lvl2)
}
}
return acc;
}, []);
如您所见,我在响应中得到了空数组,位于第2级
[
{
"objectID": "1234",
"hierarchicalCategories": {
"lvl0": ["Women's","New"],
"lvl1": ["Women's > Jewelry","New > Jewelry"],
"lvl2": ["Women's > Jewelry > New"]
}
},
{
"objectID": "5678",
"hierarchicalCategories": {
"lvl0": ["Men's", "New"],
"lvl1": ["Men's > Shoes","New > Shoes"],
"lvl2": []
}
}
]
感谢任何愿意提供帮助的人!
Map
和Set
; 阅读文档。 - Md. AmirozzamanMap
和Set
是新的。它们自EcmaScript2015以来就已经存在了。这更表明你的编辑器没有跟上过去四年的发展。 - trincot