我有一个如下所示的对象数组,其中有另一个对象数组,其中有重复的 verticalName 值,需要删除这些值才能显示在页面上。
"landingPages": [
{
"programmes": [
{
"progName": "Programme 1",
"verticals": [
{
"id": "8",
"verticalName": "Law and Criminology"
}
]
}
]
},
{
"programmes": [
{
"progName": "Programme 2",
"verticals": [
{
"id": "1",
"verticalName": "Psychology and Sociology"
}
]
}
]
},
{
"programmes": [
{
"progName": "Programme 3",
"verticals": [
{
"id": "3",
"verticalName": "Computing and IT"
}
]
}
]
},
{
"programmes": [
{
"progName": "Programme 4",
"verticals": [
{
"id": "1",
"verticalName": "Psychology and Sociology"
}
]
},
{
"progName": "Programme 5",
"verticals": [
{
"id": "3",
"verticalName": "Computing and IT"
}
]
},
{
"progName": "Programme 6",
"verticals": [
{
"id": "2",
"verticalName": "Business and Management"
}
]
},
{
"progName": "Programme 7",
"verticals": [
{
"id": "3",
"verticalName": "Computing and IT"
}
]
},
{
"progName": "Programme 8",
"verticals": [
{
"id": "3",
"verticalName": "Computing and IT"
}
]
}
]
}
]
我尝试了几种解决方案,其中一些不起作用,但其中一个起作用了,我将其复制/粘贴在下面。我已经设法将它们全部存储在一个对象数组中,只是代码对我来说看起来非常糟糕。我正在尝试找到一个更干净的解决方案来解决这个问题。这是我的解决方案,我想看看它与您的解决方案相比如何,如果您能给我一些反馈,那就太好了。
let known = {}
let noduplicates = programmes.map((subarray) => {
const newarrays = []
subarray.verticals.forEach((item) => {
if (
!known.hasOwnProperty(item.verticalName) &&
(known[item.verticalName] = true)
) {
newararys.push(item)
} else {
console.log('test')
}
})
console.log(newarrays)
return newarrays
})
const fil = filtered.filter((item) => item.length)
const singleArr = fil.reduce((a, b) => a.concat(b), [])
console.log(singleArr)
我想要得到的是这样的东西,基本上,只是在 verticals 数组中找到的所有对象,但是 - 没有重复项:
[
{id: "1", verticalName: "Psychology and Sociology"},
{id: "3", verticalName: "Computing and IT"},
{id: "2", verticalName: "Business and Management"}
]
大家干杯!
最佳答案
你可以通过纯 ES6 函数来实现它,我将分解,但你可以将所有这些都放在一行中:)
首先,您需要检索所有verticalNames
const allVerticalNames = landingPages.map(lp => lp.programmes.map(p => p.verticals))
您将有大量的数组或数组,因此我们需要展平所有这些
const flattened = allVerticalNames.flat(2)
此时您已经拥有所有的verticalNames,但还没有uniq。为此,我们应该将其转换为 Set、Map 或更简单的对象
const keyValuePairs = flattened.map(v => [v.id, v.verticalName]); // We transform to a pair key / value
const uniq = Object.fromEntries(keyValuePairs)
此时您有一个类似于 {1:“心理学和社会学”, 2:“商业和管理”, 3:“计算和 IT”, 8:“法律和犯罪学”}的对象
因此,如果您想让它恢复到示例中的方式,请将其移回数组!
const final = Object.entries(uniq).map(([id, verticalName]) => ({id, verticalName}))
就是这样!
所有内容都在一行中?
const final = Object.entries(Object.fromEntries(landingPages.map(lp => lp.programmes.map(p => p.verticals)).flat(2).map(v => [v.id, v.verticalName]))).map(([id, verticalName]) => ({id, verticalName}))
关于javascript - 从 NESTED 对象数组中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67487238/