基于另一个数组的对象的打字稿过滤器数组

ver*_*n 2 1 javascript arrays for-loop typescript

我有如下所示的对象数组

  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'
    }
  ];
Run Code Online (Sandbox Code Playgroud)

我有一个像下面给出的数字数组

let selItems = [0,2,4];
Run Code Online (Sandbox Code Playgroud)

我想要做的是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);
    }
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

[{
      id: 0,
      title: "Item 0",
      belongsTo: 'admin'
}]
Run Code Online (Sandbox Code Playgroud)

我期望的结果是这样的:

  [
    {
      id: 0,
      title: "Item 0",
      belongsTo: 'admin'
    },
    {
      id: 2,
      title: "Item 2",
      belongsTo: 'all'
    },
    {
      id: 4,
      title: "Item 4",
      belongsTo: 'all'
    }
  ]
Run Code Online (Sandbox Code Playgroud)

谁能给我示范正确的方法?谢谢!

Cer*_*nce 6

您可以.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);
Run Code Online (Sandbox Code Playgroud)

为了将计算复杂度降低到,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);
Run Code Online (Sandbox Code Playgroud)

或搭配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);
Run Code Online (Sandbox Code Playgroud)