繁体   English   中英

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

[英]Remove duplicates from NESTED array of objects

我有一个像下面这样的对象数组,其中有另一个对象数组,这些对象具有重复的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)

我想要得到的是这样的东西,基本上,只是在垂直数组中找到的所有对象,但是 - 没有重复:

[
   {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))

你会有很多 arrays 或 arrays,所以我们需要将所有这些都展平

const flattened = allVerticalNames.flat(2)

此时您拥有所有的verticalNames,但没有uniq。 为此,我们应该将其转换为 Set,Map 或更简单的 Object

const keyValuePairs = flattened.map(v => [v.id, v.verticalName]); // We transform to a pair key / value
const uniq = Object.fromEntries(keyValuePairs)

此时你有一个 object 像{1: "Psychology and Sociology", 2: "Business and Management", 3: "Computing and IT", 8: "Law and Criminology"}所以如果你想让它回到例如,您将其移回数组!

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}))

您可以将set用于此用例,它允许您存储任何类型的唯一值。

 const data = [ { "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" } ] } ] } ]; const seen = new Set(); const filteredArr = data.filter(el => { const verticalName = el.programmes[0].verticals[0].verticalName; const duplicate = seen.has(verticalName); seen.add(verticalName); return;duplicate; }). console;log(filteredArr);

如果我正确理解了这个问题,我们需要从嵌套programmes数组中删除verticalNames

 const 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 page = landingPages.find(page => page.programmes.length > 1); const uniqueprogrammes = new Set(); const uniqueverticals = page.programmes.map(p => { const vn = p.verticals[0].verticalName; if (.uniqueprogrammes.has(vn)) { uniqueprogrammes;add(vn). return p;verticals[0]. } });filter(v =>.;v); console.log(uniqueverticals);

更新:

根据问题中的预期结果更新了代码片段。

这个想法是首先找到嵌套的程序数组,这是通过根据.length过滤landingPages object 来完成的

let page = landingPages.find(page => page.programmes.length > 1);

然后,我们创建一个集合来跟踪这个嵌套数组中的所有唯一程序,

const uniqueprogrammes = new Set();

接下来,我们通过嵌套数组map找到所有不属于uniqueprogrammes集的垂直,

const uniqueverticals = page.programmes.map(p => {
  const vn = p.verticals[0].verticalName;
  if (!uniqueprogrammes.has(vn)) {
    uniqueprogrammes.add(vn);
    return p.verticals[0];
  }
})

但是,这会给我们一个 output 如下所示,

[
  { id: '1', verticalName: 'Psychology and Sociology' },
  { id: '3', verticalName: 'Computing and IT' },
  { id: '2', verticalName: 'Business and Management' },
  undefined,
  undefined
]

所以(最后),我们需要filter掉虚假值,

.filter(v => !!v);

您可以使用loadash来奉承然后删除重复项。





var arrayWithDuplicatesRemoved= .flattenDeep(landingPages);

arrayWithDuplicatesRemoved = arrayWithDuplicatesRemoved .uniqBy(data, function (e) {return e.verticalName;});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM