【问题标题】:Filtering an array based on multiple arrays inputs根据多个数组输入过滤数组
【发布时间】:2019-02-17 23:00:39
【问题描述】:

我有三个数组。 1. 现有的viewers数组——existingViewers

  1. 新观众数组 - newViewers

  2. Permitted Viewers 数组 - permittedViewers

permittedViewers 用于渲染下拉菜单。我希望从permittedViewers 中过滤newViewersexistingViewers 条目。

我分三个步骤来做这件事。而且恐怕这不是优化的方式。有人可以建议这样做的理想方式吗? 预期结果是

[
  {
    "id": 4,
    "name": "name4"
  },
  {
    "id": 5,
    "name": "name5"
  },
  {
    "id": 6,
    "name": "name6"
  }
]

let existingViewers = [{
      "viewerId": 1,
      "name": "name1"
    },
    {
      "viewerId": 2,
      "name": "name2"
    }
  ],
  newViewers = [

    {
      "viewerId": 3,
      "name": "name3"
    }
  ],
  permittedViewers = [{
      "id": 1,
      "name": "name1"
    },
    {
      "id": 2,
      "name": "name2"
    },
    {
      "id": 3,
      "name": "name3"
    },
    {
      "id": 4,
      "name": "name4"
    },
    {
      "id": 5,
      "name": "name5"
    },
    {
      "id": 6,
      "name": "name6"
    }
  ]
let grouped = [...existingViewers, ...newViewers]

let viewerFilter = grouped.map(viewer => { return viewer.viewerId; });

let filteredPermittedViewers = permittedViewers.filter(viewer => !viewerFilter.includes(viewer.id));

console.log(filteredPermittedViewers)

【问题讨论】:

  • 它看起来像一个 codereview 问题,因为代码正在运行。
  • 我投票结束这个问题,因为它应该在 Code Review SE 网站上。

标签: javascript arrays drop-down-menu filter duplicates


【解决方案1】:

我会在前两个数组的ids 中创建一个Set,然后根据集合是否包含 id 来过滤第三个。 (Sets 有O(1) 查找时间)

let existingViewers=[{"viewerId":1,"name":"name1"},{"viewerId":2,"name":"name2"}],newViewers=[{"viewerId":3,"name":"name3"}],permittedViewers=[{"id":1,"name":"name1"},{"id":2,"name":"name2"},{"id":3,"name":"name3"},{"id":4,"name":"name4"},{"id":5,"name":"name5"},{"id":6,"name":"name6"}];

const ids = new Set([...existingViewers, ...newViewers].map(({ viewerId }) => viewerId));
const output = permittedViewers.filter(({ id }) => !ids.has(id));
console.log(output);

【讨论】:

  • 这将需要在每次测试项目时构建一个新的Set - 最好提前构建集合。为了紧凑,请使用缩小器
【解决方案2】:

您可以将所有三个语句压缩成一个语句——只需将变量名替换为创建它的语句即可:

let existingViewers = [{
      "viewerId": 1,
      "name": "name1"
    },
    {
      "viewerId": 2,
      "name": "name2"
    }
  ],
  newViewers = [

    {
      "viewerId": 3,
      "name": "name3"
    }
  ],
  permittedViewers = [{
      "id": 1,
      "name": "name1"
    },
    {
      "id": 2,
      "name": "name2"
    },
    {
      "id": 3,
      "name": "name3"
    },
    {
      "id": 4,
      "name": "name4"
    },
    {
      "id": 5,
      "name": "name5"
    },
    {
      "id": 6,
      "name": "name6"
    }
  ]

let filteredPermittedViewers = permittedViewers.filter(viewer => ! [...existingViewers, ...newViewers].map(viewer => viewer.viewerId).includes(viewer.id));

console.log(filteredPermittedViewers)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2017-03-13
    • 2022-11-20
    • 2021-02-16
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多