JavaScript:按另一个对象过滤对象数组



我正在尝试基于另一个对象数组过滤一些对象。所以我从API获取数据。例如收据:

[
{
"id": 1,
"name": "test",
"category": {
"id": 1,
"name": "Cookies",
},
},
{
"id": 2,
"name": "test2",
"category": {
"id": 2,
"name": "Candy",
},
}
]

然后,我尝试根据另一个类别数组过滤类别名称上的对象。我为此创建了一个函数:

function onSelectCategory(category) {
let receiptsList = receipts.filter((a) =>
a.category.includes(category.name)
);
setReceiptsView(receiptsList);
setSelectedCategory(category);
}
const category = [ { "id": 2, "name": "Candy" } ];
onSelectCategory(category);

当我运行这个函数时,我得到一个空的Array[]。我真的不明白我做错了什么。

由于param似乎是一个对象数组,因此需要使用Array#some进行比较:

const receipts = [
{ "id": 1, "name": "test", "category": { "id": 1,  "name": "Cookies" } },
{ "id": 2, "name": "test2", "category": { "id": 2, "name": "Candy" } }
];
const categories = [ { "id": 2, "name": "Candy" } ];
const receiptsList = receipts.filter(({ category }) => 
categories.some(({ name }) => name === category.name)
);
console.log(receiptsList);

另一种使用Set:的解决方案

const receipts = [
{ "id": 1, "name": "test", "category": { "id": 1,  "name": "Cookies" } },
{ "id": 2, "name": "test2", "category": { "id": 2, "name": "Candy" } }
];
const categories = [ { "id": 2, "name": "Candy" } ];
const categorySet = new Set(categories.map(({ name }) => name));
const receiptsList = receipts.filter(({ category }) => 
categorySet.has(category.name)
);
console.log(receiptsList);

假设category(参数(是一个字符串,问题是您正试图从字符串中获取属性name,而您应该将字符串与对象进行比较。

试试这个:

a.category.name == category;

而不是

a.category.includes(category.name)

假设类别是字符串,我可能错了,请告诉我们参数category等于什么来澄清。

最新更新