типскрипт-фильтр массива объектов на основе другого массива - PullRequest
0 голосов
/ 16 мая 2019

У меня есть массив объектов, как показано ниже

  readonly allItems = [
    {
      id: 0,
      title: "Item 0",
      belongsTo: 'admin'
    },
    {
      id: 1,
      title: "Item 1",
      belongsTo: 'user'
    },
    {
      id: 2,
      title: "Item 2",
      belongsTo: 'all'
    },
    {
      id: 3,
      title: "Item 3",
      belongsTo: 'user'
    },
    {
      id: 4,
      title: "Item 4",
      belongsTo: 'all'
    }
  ];

И у меня есть массив чисел, как показано ниже

let selItems = [0,2,4];

Я пытаюсь фильтроватьмассив allItems на основе массива selItems Для этого я написал следующий код, который явно неверен.

  for(let i=0; i< this.allItems.length; i++){
      if(selItems.includes(this.allItems[i].id)){
        tempMenu.push(this.allItems[i]);
      }
      console.log(tempMenu);
    }

В качестве вывода я получаю следующее

[{
      id: 0,
      title: "Item 0",
      belongsTo: 'admin'
}]

Результат, который я ожидаю, таков:

  [
    {
      id: 0,
      title: "Item 0",
      belongsTo: 'admin'
    },
    {
      id: 2,
      title: "Item 2",
      belongsTo: 'all'
    },
    {
      id: 4,
      title: "Item 4",
      belongsTo: 'all'
    }
  ]

Может кто-нибудь показать мне правильный способ сделать это?Спасибо!

1 Ответ

5 голосов
/ 16 мая 2019

Вы можете использовать .map вместо:

const allItems = [{
    id: 0,
    title: "Item 0",
    belongsTo: 'admin'
  },
  {
    id: 1,
    title: "Item 1",
    belongsTo: 'user'
  },
  {
    id: 2,
    title: "Item 2",
    belongsTo: 'all'
  },
  {
    id: 3,
    title: "Item 3",
    belongsTo: 'user'
  },
  {
    id: 4,
    title: "Item 4",
    belongsTo: 'all'
  }
];
const selItems = [0, 2, 4];

const output = selItems.map(num => allItems.find(({ id }) => id === num));
console.log(output);

Чтобы уменьшить вычислительную сложность до O(N) вместо O(N^2), вы можете преобразовать его в объект, индексированный сначала id:

const allItems = [{
    id: 0,
    title: "Item 0",
    belongsTo: 'admin'
  },
  {
    id: 1,
    title: "Item 1",
    belongsTo: 'user'
  },
  {
    id: 2,
    title: "Item 2",
    belongsTo: 'all'
  },
  {
    id: 3,
    title: "Item 3",
    belongsTo: 'user'
  },
  {
    id: 4,
    title: "Item 4",
    belongsTo: 'all'
  }
];
const selItems = [0, 2, 4];

const allItemsById = allItems.reduce((a, item) => {
  a[item.id] = item;
  return a;
}, {});

const output = selItems.map(num => allItemsById[num]);
console.log(output);

Или с filter:

const allItems = [{
    id: 0,
    title: "Item 0",
    belongsTo: 'admin'
  },
  {
    id: 1,
    title: "Item 1",
    belongsTo: 'user'
  },
  {
    id: 2,
    title: "Item 2",
    belongsTo: 'all'
  },
  {
    id: 3,
    title: "Item 3",
    belongsTo: 'user'
  },
  {
    id: 4,
    title: "Item 4",
    belongsTo: 'all'
  }
];
const selItemsSet = new Set([0, 2, 4]);

const output = allItems.filter(({ id }) => selItemsSet.has(id));
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...