【发布时间】:2019-12-26 23:08:10
【问题描述】:
仍在学习 JS,我一直在努力解决这个问题,并在 Stack Overflow link 上找到了一个类似的解决方案,我试图在此之后为我的解决方案建模,但我似乎无法弄清楚它是否适合我的使用案例..因此,我将不胜感激有关如何修复我拥有的代码的建议,甚至只是在正确方向上提供一些帮助
所以我试图从基于“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;
}, []);
我得到了这个回应,因为你可以在 lvl2 看到空数组
[
{
"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": []
}
}
]
感谢任何愿意提供帮助的人!
【问题讨论】:
标签: javascript arrays