javascript - 从 NESTED 对象数组中删除重复项

标签 javascript reactjs lodash

我有一个如下所示的对象数组,其中有另一个对象数组,其中有重复的 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/

相关文章:

javascript - <Select> 下拉菜单顺序不正确

javascript - 如何处理从 Node Express 重定向到 React Client 的身份验证(react-router-dom 和 useContext)

css - React CSS Webpack Hashing & 使用 semantic-ui-sass, semantic-ui-react

javascript - 在 Lodash (JavaScript) 中,是否有返回第一个 "truthy"或 "meaningful"值的函数?

javascript - Lodash 与 JavaScript 内置的 map、reduce、filter

javascript - 使用 JCrop 重新缩放大图像

javascript - 使用 Angular 将字符串中编码的 HTML 转换为输入字段的纯文本

javascript - 如何在事件阶段更改时间线圆圈的颜色?

javascript - 从数组中删除所有具有特征 X 的元素,最新的除外

javascript - 使用 webpack 和 lodash 作为依赖捆绑自定义库