Фильтрация массива на основе входных данных нескольких массивов - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть три массива.1. Существующий массив зрителей - existingViewers

Новый массив зрителей - newViewers

Разрешенный массив зрителей - permittedViewers

permittedViewers используется длярендеринг выпадающего.И я хочу отфильтровать записи newViewers и existingViewers из permittedViewers.

. Я делаю это в три этапа.И я боюсь, что это не оптимизированный способ.Может кто-нибудь предложить идеальный способ сделать это?Ожидаемый результат

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

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я бы сделал Set из id с первых двух массивов, а затем отфильтровал третий по тому, содержит ли набор идентификатор. (Set с имеют 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);
0 голосов
/ 13 сентября 2018

Вы можете сжать все три оператора в один оператор - просто замените имя переменной на оператор, который его создает:

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