首页 > 解决方案 > 根据对象数组中的属性过滤数组

问题描述

给定的是以下数据结构

const list = [
  {
    title: 'Section One',
    data: [
      {
        title: 'Ay',
      },
      {
        title: 'Bx',
      },
      {
        title: 'By',
      },
      {
        title: 'Cx',
      },
    ],
  },
  {
    title: 'Section Two',
    data: [
      {
        title: 'Ay',
      },
      {
        title: 'Bx',
      },
      {
        title: 'By',
      },
      {
        title: 'Cx',
      },
    ],
  },
];

我想做的是根据每个对象的数据数组中的标题属性过滤这个列表。一个例子是有一个列表,其中孩子的标题属性以“B”开头,所以列表看起来像这样:

const filteredList = [
  {
    title: 'Section One',
    data: [
      {
        title: 'Bx',
      },
      {
        title: 'By',
      }
    ],
  },
  {
    title: 'Section Two',
    data: [
      {
        title: 'Bx',
      },
      {
        title: 'By',
      }
    ],
  },
];

到目前为止我尝试的是这样的:

 const items = list.filter(item =>
      item.data.find(x => x.title.startsWith('A')),
    );

或者

const filtered = list.filter(childList => {
  childList.data.filter(item => {
    if (item.title.startsWith('B')) {
      return item;
    }
    return childList;
  });
});

但我认为我在这里遗漏了一个要点,也许你们中的一些人可以给我一个提示或暗示我做错了什么

最好的祝福

标签: arraystypescriptfilter

解决方案


你的问题是你在.filter()list。这将保留或删除您的对象list。但是,在您的情况下,您希望保留所有对象list并将它们映射到新对象。为此,您可以使用.map(). 这样,您可以将数组中的对象映射list到包含过滤data数组的新对象。这是一个示例,说明您可以如何做到这一点:

const list=[{title:"Section One",data:[{title:"Ay"},{title:"Bx"},{title:"By"},{title:"Cx"}]},{title:"Section Two",data:[{title:"Ay"},{title:"Bx"},{title:"By"},{title:"Cx"}]}];

const filterByTitle = (search, arr) => 
  arr.map(
    ({data, ...rest}) => ({
        ...rest, 
        data: data.filter(({title}) => title.startsWith(search))
    })
  );
console.log(filterByTitle('B', list));


推荐阅读