arrays - 根据对象数组中的属性过滤数组
问题描述
给定的是以下数据结构
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;
});
});
但我认为我在这里遗漏了一个要点,也许你们中的一些人可以给我一个提示或暗示我做错了什么
最好的祝福
解决方案
你的问题是你在.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));
推荐阅读
- python - 您如何使用 python 识别(但不修复)csv 文件中的空值或重复值?
- c# - 如何用意大利语编写日期并将意大利语设置为 ASP.Net C# 中的默认语言
- reactjs - 禁止传播道具 - React Dropzone
- python - 使用 IF 函数来区分应该使用哪个 sqlite 查询?
- reactjs - React 如何通过在循环中赋值来获取当前的 ref 数据?
- php - HMVC codeigniter ERR_TOO_MANY_REDIRECTS 错误
- c - 编译器警告:在赋值时将整数转换为指针
- javascript - 在javascript(reactJS)中使用动态键名向数组添加或替换对象
- html - 如何在多个 HTML 文件中重用 HTML 代码
- windows-task-scheduler - 如何使用 Python 运行现有任务调度程序的任务?