typescript- 基于另一个数组过滤对象数组

Posted

技术标签:

【中文标题】typescript- 基于另一个数组过滤对象数组【英文标题】:typescript- filter array of objects based on another array 【发布时间】:2019-10-03 15:54:06 【问题描述】:

我有一个对象数组,如下所示

  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];

我要做的是,根据selItems 数组过滤allItems 数组 为此,我编写了以下代码,这显然是错误的。

  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】:

您可以改用.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);

【讨论】:

以上是关于typescript- 基于另一个数组过滤对象数组的主要内容,如果未能解决你的问题,请参考以下文章

Angular2使用管道基于对象数组过滤对象数组

在 Typescript 中过滤嵌套数组对象的数组

typescript 通过嵌套数组值过滤对象数组

Angular2,Typescript:如何将对象数组推入另一个对象数组,其中只有几个对象字段

用另一个对象数组过滤对象数组

对象数组按另一个数组值过滤